2024-11-16

创建专注的领域应用程序 Symfony 方法(保存实体)

创建专注的领域应用程序 symfony 方法(保存实体)

介绍

在本系列的第三篇文章中,我们将创建一个准备好从我们在本系列第一篇文章中创建的 dto 持久保存到数据库的实体。

将 userinputdto 转换为实体

从本节开始,我们假设我们正在使用原则与数据库进行通信,并且我们的 user 实体如下所示:

#[ormentity(repositoryclass: userrepository::class)]
class user
{
    #[ormid]
    #[ormgeneratedvalue]
    #[ormcolumn]
    private ?int $id = null;

    #[ormcolumn(length: 150)]
    private string $firstname;

    #[ormcolumn(length: 255)]
    private string $lastname;

    #[ormcolumn(length: 25)]
    private string $dob;

    #[ormcolumn]
    private datetimeimmutable $createdat;

    #[ormcolumn]
    private string $token;

    // getters and setters
}
登录后复制

字段 emailfirstnamelastnamedob 将填充 userinputdto 值, createdattoken 字段将按照以下规则填充:

  • 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 实体。
  • 使用 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实体管理器将其保存到数据库.

您可能已经注意到“返回”行不完整。 ¿ 我们应该返回什么?我们将在本系列的下一篇也是最后一篇文章中看到它:)

那实体呢?它们属于该域吗?

这是个好问题。在我看来,它们属于我们的领域,因为虽然它们代表数据库表到我们应用程序中的对象的映射,但它们封装了我们有关项目数据模型的决策。
现在,它们属于我们的域这一事实并不意味着它们可以用作 dto。它们应该被隔离,并且仅用于将数据保存到数据库并从数据库接收数据。

结论

在第三篇文章中,我们创建了一个域服务来创建一个准备保存到数据库的用户实体,并且还创建了一个应用程序服务,通过使用域服务创建用户和将实体保存到数据库中学说实体管理器来保存它。
在下一篇也是最后一篇文章中,我们将学习如何创建一个输出 dto,并将保存的用户信息准备返回到表示层。

如果您喜欢我的内容并喜欢阅读它,并且有兴趣了解有关 php 的更多信息,您可以阅读我的电子书,了解如何使用 php 和 symfony 框架创建面向操作的 api。您可以在这里找到它:使用 php 和 symfony 框架构建面向操作的 api:分步指南

以上就是创建专注的领域应用程序 Symfony 方法(保存实体)的详细内容,更多请关注php中文网其它相关文章!

https://www.php.cn/faq/1099703.html

发表回复

Your email address will not be published. Required fields are marked *