1

在 symfony2 中,学说生成器为每个实体创建一个类。所以向这些实体添加新行为的方法(如果我错了,请纠正我)是直接在那些生成的类中添加新的自定义方法。

我更喜欢 symfony 1 的方法,其中创建了一个空的子类并将自定义方法放置在那里。但我正在努力在 Symfony2 中使用这种方法。

有没有办法生成(然后能够更新)这个“基础实体和子类”结构?

如果不是,为什么将所有生成的和自定义的代码放在一起更好?

编辑

我一直在使用实体生成器,包括 generate:doctrine:entity 和教义:generate:entities (它们是不同的命令),并分析你的答案。似乎将所有内容放在同一个文件中的另一个缺点是实体的更新/重新生成(例如,当添加新字段时,需要重新生成 getter 和 setter)。使用这些命令,您可以设置“regenerateEntityIfExists”,但这会覆盖旧文件,删除您的自定义代码。

我正在考虑扩展 Doctrine\Bundle\DoctrineBundle\Command\GenerateEntitiesDoctrineCommand\GenerateEntitiesDoctrineCommand 以构建旧结构(具有生成代码的基类和自定义代码的空子类),它允许将自定义代码与生成的代码分开,能够更新实体以添加/删除字段等。

但我仍然想知道为什么开发团队决定将 Symfony1 中使用的方法更改为这种新方法。有哪些优势?

谢谢!

4

3 回答 3

2

如果逻辑只涉及单个Entity,直接放到Entity类中即可。如果逻辑涉及多个实体,请在单独的命名空间中创建一个新类并使其成为服务。将您要对其执行逻辑的实体注入此服务对象并在那里执行逻辑。

这有助于您在实体类中保持关注点分离,并促进服务对象的重用和可测试性。

例如,如果您有一个 Product 实体用于产品,一个 Tax 实体用于这些产品的税率,您可以创建一个 ProductTaxManager 对象并将 Product 和 Tax 实体注入此对象以进行计算。

我不确定服务容器是否是原始 Symfony 的一部分。但是您绝对应该在http://symfony.com/doc/2.2/book/service_container.html上阅读

顺便说一句,存储库类只能用于仅涉及实体本身的数据库查询,例如 FindAllSortedByAddedDate 等。

于 2013-06-05T05:49:04.190 回答
0

听起来您在谈论实体和存储库。我直到 2.0 才进入 symfony,所以我对 1.X 的工作方式不太熟悉。但是您可以拥有一个基本实体,然后您的存储库就是您加载所有自定义函数的地方。

查看http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes以获取有关自定义存储库类的更多信息

于 2013-06-04T23:52:31.467 回答
0

您可以为每个实体创建自定义 EntityRepository。在该类中,您可以添加该实体的自定义行为。请参阅 symfony2 文档

于 2013-06-04T23:53:39.607 回答