在symfony2中,doctrine生成器为每个实体创建一个类。因此,向这些实体添加新行为的方法(如果我错了请纠正我)是直接在这些生成的类中添加新的自定义方法。
我更喜欢symfony 1的方法,其中创建了一个空子类,并在那里放置了自定义方法。但是我很难在Symfony2中使用这种方法。
有没有办法生成(然后能够更新)这个“Base Entity& SubClass”结构?
如果没有,为什么将所有生成和自定义代码放在一起会更好?
修改
我一直在玩实体生成器,都生成:doctrine:entity和doctrine:generate:entities(这是不同的命令),并分析你的答案。似乎所有在同一文件中的另一个缺点是实体的更新/重新生成(例如,当添加新字段时,需要重新生成getter和setter)。使用这些命令,您可以设置'regenerateEntityIfExists',但会覆盖旧文件,删除自定义代码。
我正在考虑扩展Doctrine \ Bundle \ DoctrineBundle \ Command \ GenerateEntitiesDoctrineCommand \ GenerateEntitiesDoctrineCommand以构建旧结构(具有生成代码的基类和自定义代码的空子类),这允许将自定义代码与生成的代码分开,能够更新实体以添加/删除字段等。
但我仍然想知道为什么开发团队决定将Symfony1中使用的方法更改为这个新方法。哪个有优势?
谢谢!
答案 0 :(得分:2)
如果逻辑只涉及单个实体,请直接将其放入Entity类。如果逻辑涉及多个实体,则在单独的命名空间中创建一个新类并使其成为服务。将要执行逻辑的实体注入此服务对象并在那里执行逻辑。
这有助于您在实体类中保持关注点分离,并促进服务对象的重用和可测试性。
例如,如果您有产品的产品实体和这些产品的税率实体,您可以创建一个ProductTaxManager对象并将Product和Tax实体注入此对象以进行计算。
我不确定服务容器是否是原始Symfony的一部分。但你绝对应该在http://symfony.com/doc/2.2/book/service_container.html
做一些阅读顺便说一下,存储库类只应该用于仅涉及Entity的数据库查询,例如FindAllSortedByAddedDate等。
答案 1 :(得分:0)
听起来你在谈论实体和存储库。我没有进入symfony直到2.0所以我不熟悉1.X工作。但是您可以拥有一个基本实体,然后您的存储库就可以加载所有自定义函数。
查看http://symfony.com/doc/2.0/book/doctrine.html#custom-repository-classes以获取有关自定义存储库类的更多信息
答案 2 :(得分:0)
您可以为每个实体创建自定义EntityRepository。 在该类中,您可以添加该实体的自定义行为。 请see the symfony2 documents