如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器
Posted
技术标签:
【中文标题】如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器【英文标题】:How to get entity manager for Doctrine entity with Symfony 2.1 from inside controller 【发布时间】:2012-10-06 21:50:59 【问题描述】:如何使用最新的 Symfony 和 Doctrine 从控制器内部获取实体管理器?
“The Book”中描述的方式现在被标记为已弃用。什么是现代(正确)方法?
public function someAction()
// getEntityManager() from Doctrine\Bundle\DoctrineBundle\Registry is deprecated
$entityManager = $this->getDoctrine()->getEntityManager();
...
【问题讨论】:
其实我直到最近才知道弃用的方法,它在 symfony2 调试页面中被标记为警告,它还告诉我应该使用什么新方法。所以我猜大多数时候你会在调试页面中找到答案。 【参考方案1】:请改用$this->getDoctrine()->getManager()
。
实际上,最好不要让控制器知道您正在使用的持久层。这些东西应该移到Service Layer 以抽象数据的持久化方式。
【讨论】:
什么意思?是否应该将所有与数据库相关的方法移至服务层?有什么好处? EntityManager 已经在服务层中(我想)。还是我误解了什么?能举个例子吗? @AlanChavez,这都是关于代码单元可以更改的原因。例如,如果您从 ORM 切换到 ODM,则应该只更改数据访问层。如果这种变化波及控制器,那么您在分离关注点方面失败了。一个代码单元——比如一个层或一个类——应该只因为一种原因而改变。阅读一些关于 OO 模式和设计的书籍。还有谷歌SOLID。 我认为 Symfony 文档并不打算鼓励这种做法,相反,我认为它们只是用作向您展示完成给定任务所需的组件的指南。让开发人员决定逻辑应该放在哪里。 @AlanChavez,鉴于 php 开发人员的平均水平,Symfony 文档的目标受众是初级到中级开发人员。直接从文档中的控制器引用 Doctrine 更容易,而不是创建层和层,这会使初学者的开发人员变得复杂。但是,如果您是一名高级开发人员并且对良好的 OO 方法感到满意,那么您可以自己弄清楚如何进行分层。 @ElnurAbdurrakhimov:我是 php 和 symfony 的初学者,但想从一开始就学习和习惯最佳实践,你有显示关注点分离的示例吗?谢谢!以上是关于如何使用 Symfony 2.1 从内部控制器获取 Doctrine 实体的实体管理器的主要内容,如果未能解决你的问题,请参考以下文章