Symfony3 - 将服务引入实体
Symfony3 - Getting service into entity
我目前正在使用 Symfony 3.4。
我了解到不建议将服务引入实体 class。为什么?
假设我们在此实体中有一个方法 saveFile() class。在这个方法中可以抛出异常,所以我们放了一个 try/catch 块,在 catch 块中我们想要记录异常。要记录异常,我们需要使用记录器服务,但我们不能这样做,因为不推荐这样做。
所以最后我们必须将 try/catch 块移动到控制器中以获取 catch 块中的服务。每次在控制器中调用 saveFile() 方法时,我们都必须这样做。不是重复的吗?干什么?
最好的方法是什么?
谢谢。
Symfony 使用 Doctrine。
Doctrine 实现了 "Data Mapper" 设计模式。
这与实现您描述的行为的 "Active Record" 模式不同,即 $myEntity->save()
。
这方面的主要区别在于,在数据映射器模式中,实体仅描述它们所代表的数据的结构。
他们对将他们转入任何数据存储的方法一无所知。
在 doctrine 的情况下,这由实体管理器处理,实体管理器将获取给定的实体对象并将其映射到数据库中的一行。
这种方法在存储/检索数据的逻辑与将数据保存在应用程序模型级别的构造之间实现了一定程度的分离。
所以,您通常不将服务或数据库调用或其他任何东西放入您的实体的原因是,这种方法通常是相反的,因为实体被传递给服务,然后服务开始并用它。
在此处查看有关 PHP 中数据映射器的一些抽象信息:https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html
也有帮助:https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/
我目前正在使用 Symfony 3.4。
我了解到不建议将服务引入实体 class。为什么?
假设我们在此实体中有一个方法 saveFile() class。在这个方法中可以抛出异常,所以我们放了一个 try/catch 块,在 catch 块中我们想要记录异常。要记录异常,我们需要使用记录器服务,但我们不能这样做,因为不推荐这样做。 所以最后我们必须将 try/catch 块移动到控制器中以获取 catch 块中的服务。每次在控制器中调用 saveFile() 方法时,我们都必须这样做。不是重复的吗?干什么?
最好的方法是什么?
谢谢。
Symfony 使用 Doctrine。
Doctrine 实现了 "Data Mapper" 设计模式。
这与实现您描述的行为的 "Active Record" 模式不同,即 $myEntity->save()
。
这方面的主要区别在于,在数据映射器模式中,实体仅描述它们所代表的数据的结构。
他们对将他们转入任何数据存储的方法一无所知。
在 doctrine 的情况下,这由实体管理器处理,实体管理器将获取给定的实体对象并将其映射到数据库中的一行。
这种方法在存储/检索数据的逻辑与将数据保存在应用程序模型级别的构造之间实现了一定程度的分离。
所以,您通常不将服务或数据库调用或其他任何东西放入您的实体的原因是,这种方法通常是相反的,因为实体被传递给服务,然后服务开始并用它。
在此处查看有关 PHP 中数据映射器的一些抽象信息:https://designpatternsphp.readthedocs.io/en/latest/Structural/DataMapper/README.html
也有帮助:https://www.culttt.com/2014/06/18/whats-difference-active-record-data-mapper/