Symfony3 - 将服务引入实体

时间:2018-06-15 13:29:17

标签: php symfony dry symfony-3.4

我目前正在使用Symfony 3.4。

我已经读过它不建议将服务转换为实体类。为什么?

想象一下,我们在这个实体类中有一个方法saveFile()。可以在此方法中抛出异常,因此我们将try / catch块放在catch块中,我们要记录异常。要记录异常,我们需要使用记录器服务,但我们不能这样做,因为它不推荐。 所以最后我们必须将try / catch块移动到控制器中以获取catch块中的服务。每次在控制器中调用saveFile()方法时都要这样做。它不重复吗?干什么?

这样做的最佳方式是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

Symfony使用Doctrine。

Doctrine实现了“Data Mapper”设计模式。

这与实现您描述的行为的“活动记录”模式不同,即$myEntity->save()

这方面的关键区别在于,在数据映射器模式中,实体仅描述它们所代表的数据的结构。

他们对将它们转换为任何数据存储的方法一无所知。

在学说的情况下,由实体管理器处理,它将获取给定的实体对象并将其映射到数据库中的一行。

这种方法在存储/检索数据的逻辑与在应用程序的模型级别内保存数据的构造之间实现了一定程度的分离。

因此,您通常不会将服务或数据库调用或其他任何内容放入您的实体的原因是因为该方法通常是另一种方式,因为实体被传递给服务,然后服务随之而来。

在这里查看有关PHP中数据映射器的一些抽象信息:https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html

也很有帮助:https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/