我是Symfony的新手,我来自MVC框架,其中只有一个模型类,但在Symfony中我们有2个,据我所知(实体和存储库)
所以,我不确定什么时候应该把一个方法放在Entity类中,什么时候应该放在Repository中...
例如:
$user->logLogin()
将用户登录(时间戳,IP,国家/地区,用户代理ecc。)记录到log_logins表中,并从登录事件监听器调用它,它应该在哪里? (我不会创建UserLogins实体,因为不需要操作该表上的数据,它只是一些只读信息)
答案 0 :(得分:4)
可能不会立即显现,但在Symfony中,您使用服务进行操作。 login方法不属于实体或存储库。
总体思路如下:
典型的控制器调用一些服务,通常不直接触及存储库(或Doctrine)。
这个结构在许多例子中并不明显,为了尽可能简单和简洁,删除了其中的一些层。
注意:Symfony有一个丰富的登录系统,它已经连接到它的几个组件,你可以在没有重新实现新组件的情况下使用它。我建议你去看看。
答案 1 :(得分:1)
实体和存储库是两个完全不同的东西。存储库不是模型。实体代表您的模型。 Repository与数据库的接口。您之前的框架很可能使用了主动记录方法,而不是Doctrine 2使用的数据映射方法。这需要重新思考。
要回答您的问题,logLogin会更新数据库,因此它不仅会进入存储库,而且无法进入实体,原因很简单,因为实体没有连接到数据库。
因此,您将存储库注入您的侦听器,然后,当您发生登录事件时,您执行以下操作:
$this->userRepository->logLogin($user);