【问题标题】:Symfony, entity vs repositorySymfony,实体与存储库
【发布时间】:2016-10-08 22:28:06
【问题描述】:

我是 Symfony 的新手,我来自一个 MVC 框架,其中只有一个 Model 类,但据我所知,在 Symfony 中我们有 2 个(实体存储库

所以,我不确定什么时候应该将方法放在实体类中,什么时候应该放在存储库中......

例如:

$user->logLogin()

它将用户登录(时间戳、ip、国家、用户代理 ecc。)记录到 log_logins 表中,并从登录事件侦听器中调用,它应该去哪里? (我不打算创建 UserLogins 实体,因为不需要操作该表上的数据,它只是一些只读信息)

【问题讨论】:

  • 简而言之......实体是应用程序中表的表示,因此将与其属性相关的所有方法都放在实体上,例如:$user->getEmail()。存储库是一种检索实体的方法,因此可以在存储库中添加获取实体所需的任何方法,例如 getUserByEmail 或其他任何方式。
  • log_login 与表user 以多对一的关系连接。 Tou 可以使用学说关系并在user 实体中包含方法addLogLogin()。在user 实体中,将有logLogin 类型为ArrayCollection 的属性。描述于doc

标签: symfony


【解决方案1】:

这可能不是很明显,但在 Symfony 中,您使用 服务 来做事。登录方法既不属于实体也不属于存储库。

大致思路如下:

  • 实体:一种数据结构。几乎从来没有一个有意义的方法不是访问器。
  • 存储库:与数据库交互的唯一部分。在大多数情况下,您使用默认值,但如果您有一些特殊查询,则需要一个。业务逻辑也不应该在这里。
  • 服务:业务逻辑所在的位置。有很多。让他们使用其他服务和存储库

一个典型的控制器调用一些服务,通常不直接接触存储库(或 Doctrine)。

这种结构在许多示例中并不明显,这些示例为了尽可能简单和简洁而删去了其中的一些层。

注意:Symfony 有一个丰富的登录系统,它已经连接到它的几个组件,你可以在不重新实现新组件的情况下使用它。建议去看看。

【讨论】:

  • 据我了解,存储库用于从数据库中读取。但是对于插入一个实体(new、set、flush、commit),这会去哪里呢? The docs 将该代码放入控制器中。
  • 通常他们去服务。文档中的示例通常将清晰性放在首位,因此它们是简约的,并不代表典型的用例。
【解决方案2】:

Entity 和 Repository 是两个完全不同的东西。存储库不是模型。实体代表您的模型。存储库接口到数据库。您以前的框架很可能使用了主动记录方法,而不是 Doctrine 2 使用的数据映射器方法。这需要重新考虑。

为了回答您的问题,logLogin 会更新数据库,因此它不仅会进入存储库,而且不能进入实体,原因很简单,即实体与数据库没有连接.

因此,您可以将存储库注入到您的侦听器中,然后,当登录事件发生时,您可以这样做:

$this->userRepository->logLogin($user);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-14
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多