ホームページ > バックエンド開発 > PHPチュートリアル > PHP での DDD ユースケースの実装

PHP での DDD ユースケースの実装

Patricia Arquette
リリース: 2024-11-12 22:18:02
オリジナル
1051 人が閲覧しました

Implementing a DDD Use Case in PHP

PHP での DDD ユースケースの実装

この記事では、PHP のドメイン駆動設計 (DDD) ユースケース モデルを検討し、インターフェイスとドメイン固有のクラスを利用してデータの永続性を管理する方法を示します。 TaxPersistUseCase クラスを調べます。このクラスは永続化マネージャー (TaxManagerInterface) を使用して、税金を表す Tax 型のエンティティを保存します。

このモデルは DDD 原則を強調しています。依存関係の挿入とエラー処理のベスト プラクティスに従って、各コンポーネントがインターフェイス、具体的な実装、例外に明確に分離されています。

TaxPersistUseCase の構造

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 のインスタンスを注入し、TaxPersistUseCase を特定の実装に結合することなく、Tax オブジェクトの永続性をこのインスタンスに委任します。
  • リクエストタイプのチェック:execute メソッドは、$request オブジェクトが TaxPersistRequestInterface を実装していることを検証します。これにより、受信したリクエストが期待されるコントラクトに準拠していることが保証され、インターフェイスレベルの検証が提供されます。
  • Tax オブジェクトの永続化: リクエストが有効な場合、ユースケースは getTax() を介して $request から Tax オブジェクトを抽出し、TaxManagerInterface の applicationPersist メソッドを呼び出します。この永続化プロセスは、潜在的な例外を処理するために try-catch ブロック内にカプセル化されています
  • EmptyResultException: Tax エンティティが見つからない場合、この例外が捕捉され、エラーを通知するために NotFoundException がスローされます。
  • FormException: フォームの検証が失敗した場合、FormException がキャプチャされ、エラー メッセージが StringCollection に保存されます。
  • 匿名クラスによる動的応答: 匿名クラスは、TaxPersistResponseInterface を実装して、ユースケースの応答を返します。これには getTax() メソッドと getMessages() メソッドが含まれており、それぞれ Tax エンティティとエラー メッセージにアクセスできます。

ユースケースインターフェイス

インターフェイスは、各コンポーネントが遵守する必要がある規約を定義し、分離とテスト容易性を促進します。

税務マネージャーインターフェイス

このインターフェースは、取得や永続化など、税金を管理するためのメソッドを指定します:

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(): このメソッドは、Tax エンティティの永続性を保証します。

TaxPersistRequestInterface

このインターフェースは、TaxPersistUseCase によって予期されるリクエストの構造を定義します:

interface TaxManagerInterface
{
    public function findById(int $id): Tax;
    public function findByName(string $name): Tax;
    public function applicationPersist(Tax $tax): self;
}
ログイン後にコピー
  • getTax() : このメソッドは永続化される Tax エンティティを返し、ユースケースが関連するドメイン オブジェクトに直接アクセスできるようにします。 TaxPersistResponseInterface
  • 応答インターフェイスにより、TaxPersistUseCase が準拠した応答を返すことが保証されます。
interface TaxPersistRequestInterface extends RequestInterface
{
    public function getTax(): Tax;
}
ログイン後にコピー
  • getTax(): 永続化された Tax エンティティを返すか、エラーが発生した場合は null を返します。
  • getMessages(): フォーム エラーが発生した場合は、エラー メッセージを含む StringCollection を返します。

エラーと例外の処理

例外は、ドメイン固有のエラーを捕捉することにより、DDD で重要な役割を果たします。

  • BadRequestException: ユースケースが間違ったタイプのリクエストを受信した場合にスローされます。
  • NotFoundException: 探した税エンティティが見つからない場合にスローされます。
  • FormException: 検証エラーを処理するためにキャッチされ、エラー メッセージが StringCollection で返されます。

以上がPHP での DDD ユースケースの実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート