このシリーズの 3 回目の投稿では、シリーズの最初の記事で作成した DTO からデータベースに永続化できるエンティティを作成します。
このセクションを始めるにあたり、データベースとの通信に 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 }
フィールド email、firstname、lastname、および dob には、UserInputDTO の値が入力され、 createdAt フィールドと token フィールドは、次のルールに従って入力されます:
エンティティ フィールドにどのように入力するかを決定したので、コードのこの部分はドメイン ビジネス ルールが含まれているため、ドメインに属します。したがって、これを行うにはサービス ドメインが必要です。コードを書いてみましょう。
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 エンティティを作成し、エンティティを返します。
次に、エンティティの保存に関連するプロセスの調整を担当するサービスが必要です。
コーディングしましょう。
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 サイトの他の関連記事を参照してください。