本文探討了 PHP 中的領域驅動設計 (DDD) 用例模型,示範如何利用介面和特定於領域的類別來管理資料持久性。我們將檢查 TaxPersistUseCase 類,它使用持久性管理器 (TaxManagerInterface) 來保存代表稅的 Tax 類型的實體。
此模型強調 DDD 原則:每個元件都清晰地分為介面、具體實作和異常,遵循依賴注入和錯誤處理的最佳實踐。
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 類別依賴多個介面和異常來處理稅務持久性。以下是他們的角色細分:
TaxPersistRequestInterface 和 TaxPersistResponseInterface :用例請求和回應的介面。
異常:各種異常,例如 BadRequestException、FormException 和 NotFoundException,有助於管理特定於上下文的錯誤。
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;
介面定義了每個元件必須遵守的契約,促進解耦和可測試性。
此介面指定了管理稅收的方法,包括檢索和持久化:
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; } }; } }
此介面定義了 TaxPersistUseCase 所期望的請求的結構:
interface TaxManagerInterface { public function findById(int $id): Tax; public function findByName(string $name): Tax; public function applicationPersist(Tax $tax): self; }
interface TaxPersistRequestInterface extends RequestInterface { public function getTax(): Tax; }
異常透過捕捉特定於域的錯誤在 DDD 中發揮重要作用:
以上是在 PHP 中實作 DDD 用例的詳細內容。更多資訊請關注PHP中文網其他相關文章!