ホームページ >バックエンド開発 >PHPチュートリアル >焦点を絞ったドメイン アプリケーションの作成。 Symfony のアプローチ (エンティティの保存)

焦点を絞ったドメイン アプリケーションの作成。 Symfony のアプローチ (エンティティの保存)

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 03:30:04805ブラウズ

Creating focused domain applications. A Symfony approach (Saving the entity)

導入

このシリーズの 3 回目の投稿では、シリーズの最初の記事で作成した DTO からデータベースに永続化できるエンティティを作成します。

UserInputDTO をエンティティに変換する

このセクションを始めるにあたり、データベースとの通信に doctrine を使用しており、User エンティティが次のようになっていると仮定します。

#[ORM\Entity(repositoryClass: UserRepository::class)]
class User
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 150)]
    private string $firstname;

    #[ORM\Column(length: 255)]
    private string $lastname;

    #[ORM\Column(length: 25)]
    private string $dob;

    #[ORM\Column]
    private \DateTimeImmutable $createdAt;

    #[ORM\Column]
    private string $token;

    // getters and setters
}

フィールド emailfirstnamelastname、および dob には、UserInputDTO の値が入力され、 createdAt フィールドと token フィールドは、次のルールに従って入力されます:

  • createdAt フィールドには現在の日付が保持されます。
  • トークンフィールドには、50 文字の英数字の文字列が保持されます。

エンティティ フィールドにどのように入力するかを決定したので、コードのこの部分はドメイン ビジネス ルールが含まれているため、ドメインに属します。したがって、これを行うにはサービス ドメインが必要です。コードを書いてみましょう。

class UserEntityBuilder {

    public function buildEntity(UserInputDTO $userInputDto): User
    {
        $user = new User();
        $user->setEmail($userInputDto->email);
        $user->setFirstname($userInputDto->firstname);
        $user->setLastname($userInputDto->lastname);
        $user->setDob($userInputDto->dob);
        $user->setToken(bin2hex(random_bytes(50)));
        $user->setCreatedAt(new \DateTimeImmutable());

        return $user;
    }
}

ご覧のとおり、UserEntityBuilder buildEntity メソッドは、事前に確立されたルールに従って User エンティティを作成し、エンティティを返します。

エンティティを作成および保存するためのアプリケーション サービス

次に、エンティティの保存に関連するプロセスの調整を担当するサービスが必要です。

  • 最近作成した UserEntityBuilder ドメイン サービスを使用して、User エンティティを作成します。
  • doctrine EntityManager サービスを使用してデータベース上にエンティティを永続化します。 EntityManager サービスは、Symfony フレームワークによってその symfony/orm-pack コンポーネントを通じて提供されるため、インフラストラクチャ サービスとして考慮される必要があります。

コーディングしましょう。

class UserCreator {

    public function __construct(
        private readonly UserEntityBuilder $userEntityBuilder,
        private readonly EntityManagerInterface $em,
    ){}

    public function createUser(UserInputDTO $userInputDto): object
    {
        $user = $this->userEntityBuilder->buildEntity($userInputDto);
        $this->em->persist($user);
        $this->em->flush();

        return '.....'; // Return a DTO ready to be used by the presentation layer
    }
}

上記のコードでわかるように、UserCreator アプリケーション層サービスは、最初に UserEntityBuilder を使用してエンティティを作成し、次に Doctrine エンティティ マネージャーを使用してそれをデータベースに保存します。 .

「return」行が完了していないことに気づいたかもしれません。ここで何を返すべきですか?それについては、このシリーズの次回と最後の記事で説明します :)

実体についてはどうでしょうか。それらはドメインに属していますか?

これは良い質問です。私の意見では、これらはアプリケーション内のオブジェクトへのデータベース テーブルのマッピングを表しますが、プロジェクトのデータ モデルに関する決定をカプセル化しているため、これらは私たちのドメインに属すると考えられます。
さて、それらが私たちのドメインに属することができるという事実は、それらが DTO として使用できることを意味するものではありません。これらは分離され、データベースへのデータの保存とそこからのデータの受信にのみ使用される必要があります。

結論

この 3 番目の記事では、データベースに永続化できるユーザー エンティティを作成するドメイン サービスを作成しました。また、ドメイン サービスを使用してユーザーとエンティティを作成し、エンティティをデータベースに保存するアプリケーション サービスも作成しました。ドクトリンエンティティマネージャーがそれを保存します。
次回と最後の記事では、保存されたユーザー情報をプレゼンテーション層に返す準備ができている出力 DTO を作成する方法を詳しく学びます。

私のコンテンツが気に入って楽しく読んで、PHP についてもっと学びたい場合は、PHP と Symfony フレームワークを使用してオペレーション指向の API を作成する方法についての私の電子ブックを読むことができます。ここで見つけることができます: PHP と Symfony フレームワークを使用した操作指向の API の構築: ステップバイステップ ガイド

以上が焦点を絞ったドメイン アプリケーションの作成。 Symfony のアプローチ (エンティティの保存)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。