Symfony,实体与存储库

时间:2016-06-08 14:58:13

标签: symfony

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

所以,我不确定什么时候应该把一个方法放在Entity类中,什么时候应该放在Repository中...

例如:

$user->logLogin()

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

2 个答案:

答案 0 :(得分:4)

可能不会立即显现,但在Symfony中,您使用服务进行操作。 login方法不属于实体或存储库。

总体思路如下:

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

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

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

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

答案 1 :(得分:1)

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

要回答您的问题,logLogin会更新数据库,因此它不仅会进入存储库,而且无法进入实体,原因很简单,因为实体没有连接到数据库。

因此,您将存储库注入您的侦听器,然后,当您发生登录事件时,您执行以下操作:

$this->userRepository->logLogin($user);
相关问题