在本系列的第三篇文章中,我們將建立一個準備好從我們在本系列第一篇文章中建立的 DTO 持久保存到資料庫的實體。
從本節開始,我們假設我們正在使用原則與資料庫進行通信,並且我們的 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 將填入 和token 欄位將依照下列規則填入:
createdAt
如您所見,
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; } }
buildEntity 方法依照預先建立的規則建立 User 實體並傳回實體。 用於建立和保存實體的應用程式服務
現在,我們需要一個服務來負責協調保存實體所涉及的流程:使用我們最近建立的
UserEntityBuilder
如你在上面的程式碼中所看到的,
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 } }
UserEntityBuilder建立實體,然後使用Doctrine實體管理器將其儲存到資料庫. 您可能已經注意到「返回」行不完整。 ¿ 我們應該返回什麼?我們將在本系列的下一篇也是最後一篇文章中看到它:)
這是個好問題。在我看來,它們屬於我們的領域,因為雖然它們代表資料庫表到我們應用程式中的物件的映射,但它們封裝了我們有關項目資料模型的決策。
現在,它們屬於我們的域這一事實並不意味著它們可以用作 DTO。它們應該被隔離,並且僅用於將資料保存到資料庫並從那裡接收資料。
在第三篇文章中,我們創建了一個域服務來創建一個準備保存到資料庫的用戶實體,並且還創建了一個應用程式服務,透過使用域服務創建用戶和將實體保存到資料庫中說實體管理器來保存它。
在下一篇也是最後一篇文章中,我們將學習如何建立一個輸出 DTO,其中保存的使用者資訊準備返回到表示層。
如果您喜歡我的內容並喜歡閱讀它,並且有興趣了解有關 PHP 的更多信息,您可以閱讀我的電子書,了解如何使用 PHP 和 Symfony 框架創建面向操作的 API。您可以在這裡找到它:使用 PHP 和 Symfony 框架建立面向操作的 Api:逐步指南
以上是創建專注的領域應用程式。 Symfony 方法(儲存實體)的詳細內容。更多資訊請關注PHP中文網其他相關文章!