首頁 >後端開發 >php教程 >在 PHP 中實作 DDD 用例

在 PHP 中實作 DDD 用例

Patricia Arquette
Patricia Arquette原創
2024-11-12 22:18:021009瀏覽

Implementing a DDD Use Case in PHP

在 PHP 中實作 DDD 用例

本文探討了 PHP 中的領域驅動設計 (DDD) 用例模型,示範如何利用介面和特定於領域的類別來管理資料持久性。我們將檢查 TaxPersistUseCase 類,它使用持久性管理器 (TaxManagerInterface) 來保存代表稅的 Tax 類型的實體。

此模型強調 DDD 原則:每個元件都清晰地分為介面、具體實作和異常,遵循依賴注入和錯誤處理的最佳實踐。

TaxPersist用例的結構

TaxPersistUseCase 類別處理與持久稅收相關的業務邏輯。它分為幾個部分來闡明這種方法的邏輯和結構。

依賴聲明

namespace Domain\Application\UseCase\Order;

use Domain\Application\Entity\Order\Tax;
use Domain\Application\Gateway\Manager\Order\TaxManagerInterface;
use Domain\Application\UseCase\Order\Exception\NotFoundException;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistRequestInterface;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistResponseInterface;
use Domain\Exception\BadRequestException;
use Domain\Exception\FormException;
use Small\CleanApplication\Contract\UseCaseInterface;
use Small\Collection\Collection\StringCollection;
use Small\SwooleEntityManager\EntityManager\Exception\EmptyResultException;

TaxPersistUseCase 類別依賴多個介面和異常來處理稅務持久性。以下是他們的角色細分:

TaxManagerInterface :稅務持久性管理器的介面。

TaxPersistRequestInterface 和 TaxPersistResponseInterface :用例請求和回應的介面。
異常:各種異常,例如 BadRequestException、FormException 和 NotFoundException,有助於管理特定於上下文的錯誤。

TaxPersistUseCase 類別的實現

namespace Domain\Application\UseCase\Order;

use Domain\Application\Entity\Order\Tax;
use Domain\Application\Gateway\Manager\Order\TaxManagerInterface;
use Domain\Application\UseCase\Order\Exception\NotFoundException;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistRequestInterface;
use Domain\Application\UseCase\Order\Interfaces\TaxPersistResponseInterface;
use Domain\Exception\BadRequestException;
use Domain\Exception\FormException;
use Small\CleanApplication\Contract\UseCaseInterface;
use Small\Collection\Collection\StringCollection;
use Small\SwooleEntityManager\EntityManager\Exception\EmptyResultException;
  • 建構函式與相依性注入:建構函式註入一個 TaxManagerInterface 實例,將 Tax 物件的持久性委託給該實例,而不將 TaxPersistUseCase 耦合到特定實作。
  • 請求類型檢查:execute 方法驗證 $request 物件是否實作了 TaxPersistRequestInterface。這確保收到的請求符合預期的合同,提供介面級驗證。
  • 持久化稅務對象:如果請求有效,則使用案例透過 getTax() 從 $request 中提取稅務對象,並呼叫 TaxManagerInterface 上的 applicationPersist 方法。這個持久化過程被封裝在一個try-catch區塊中來處理潛在的異常
  • EmptyResultException:如果找不到 Tax 實體,則會捕獲此例外狀況並拋出 NotFoundException 來表示錯誤。
  • FormException:如果表單驗證失敗,則會擷取 FormException,並將錯誤訊息儲存在 StringCollection 中。
  • 透過匿名類別的動態回應:匿名類別實作 TaxPersistResponseInterface 以傳回用例的回應。它包括 getTax() 和 getMessages() 方法,分別允許存取稅務實體和任何錯誤訊息。

用例介面

介面定義了每個元件必須遵守的契約,促進解耦和可測試性。

稅務管理介面

此介面指定了管理稅收的方法,包括檢索和持久化:

class TaxPersistUseCase implements UseCaseInterface
{

    public function __construct(
        protected TaxManagerInterface $taxManager,
    ) {}

    public function execute(mixed $request): TaxPersistResponseInterface
    {

        if (!$request instanceof TaxPersistRequestInterface) {
            throw new BadRequestException(
                self::class . ' accepts only request instance of ' . TaxPersistRequestInterface::class
            );
        }

        $tax = $request->getTax();
        $messages = new StringCollection();

        try {
            $this->taxManager->applicationPersist($tax);
        } catch (EmptyResultException $e) {
            throw new NotFoundException($e->getMessage());
        } catch (FormException $e) {
            $messages = $e->getFormMessages();
        }

        return new class($tax, $messages) implements TaxPersistResponseInterface
        {
            public function __construct(
                protected readonly Tax $tax,
                protected readonly StringCollection $messages,
            ) {}

            public function getTax(): Tax
            {
                return $this->tax;
            }

            public function getMessages(): StringCollection
            {
                return $this->messages;
            }
        };

    }

}
  • findById() 和 findByName():這些方法可以透過 ID 或名稱檢索稅金。
  • applicationPersist():此方法確保稅務實體的持久性。

TaxPersistRequest接口

此介面定義了 TaxPersistUseCase 所期望的請求的結構:

interface TaxManagerInterface
{
    public function findById(int $id): Tax;
    public function findByName(string $name): Tax;
    public function applicationPersist(Tax $tax): self;
}
  • getTax() :此方法傳回要持久保存的 Tax 實體,允許用例直接存取相關領域物件。 TaxPersistResponse介面
  • 回應介面確保 TaxPersistUseCase 回傳合規的回應:
interface TaxPersistRequestInterface extends RequestInterface
{
    public function getTax(): Tax;
}
  • getTax():傳回持久化的稅務實體,如果發生錯誤則傳回 null。
  • getMessages():如果發生表單錯誤,則傳回包含錯誤訊息的 StringCollection。

錯誤和異常處理

異常透過捕捉特定於域的錯誤在 DDD 中發揮重要作用:

  • BadRequestException:如果用例收到錯誤類型的請求,則拋出。
  • NotFoundException:當找不到所尋求的稅務實體時拋出。
  • FormException:捕獲以處理驗證錯誤,錯誤訊息在 StringCollection 中傳回。

以上是在 PHP 中實作 DDD 用例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn