創建專注的領域應用程式。 Symfony 方法(儲存實體)

Mary-Kate Olsen
發布: 2024-11-17 03:30:04
原創
745 人瀏覽過

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

介紹

在本系列的第三篇文章中,我們將建立一個準備好從我們在本系列第一篇文章中建立的 DTO 持久保存到資料庫的實體。

將 UserInputDTO 轉換為實體

從本節開始,我們假設我們正在使用原則與資料庫進行通信,並且我們的 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
}
登入後複製

欄位emailfirstnamelastnamedob 將填入 和token 欄位將依照下列規則填入:

createdAt
    欄位將保存目前日期。
  • 令牌
  • 欄位將包含 50 個字母數字字元的字串。
  • 當我們決定如何填入實體欄位時,這部分程式碼將屬於網域,因為它包含網域業務規則。因此,我們需要一個服務域來完成這些工作。讓我們來編碼吧。


如您所見,

UserEntityBuilder
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
    網域服務建立
  • User 實體。 使用 EntityManager 服務將實體持久保存在資料庫上。 EntityManager
  • 服務應被視為基礎設施服務,因為它是由 Symfony 框架透過其
  • symfony/orm-pack 元件提供的。 讓我們來編碼。


如你在上面的程式碼中所看到的,

UserCreator
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中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板