Symfony,实体与存储库

Car*_*nni 5 symfony

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

因此,我不确定何时将方法放入Entity类中以及何时将其放入存储库中...

例如:

$user->logLogin()
Run Code Online (Sandbox Code Playgroud)

哪个将用户登录名(时间戳,ip,国家/地区,用户代理等)记录到log_logins表中,并从登录事件侦听器中调用它,该在哪里去?(由于不需要操纵该表上的数据,因此我不会创建UserLogins实体,这只是一些只读信息)

Rad*_*d80 6

这可能不会立即显现出来,但是在Symfony中,您可以通过服务做事。登录方法既不属于实体也不属于存储库。

总体思路如下:

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

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

在许多示例中,为了尽可能简单和简短,将这些层中的一些切掉了,这种结构并不明显。

注意:Symfony具有丰富的登录系统,该系统已经连接到其多个组件,您可能会在不重新实现一个新组件的情况下使用它。我建议看看。


Cer*_*rad 2

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

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

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

$this->userRepository->logLogin($user);
Run Code Online (Sandbox Code Playgroud)