如何使用 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 实体的实体管理器的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 4,从控制器获取 .env 参数,是不是可能以及如何?

如何在Symfony2中获取控制器的所有路由列表?

Symfony2.8。如何从发布请求中获取数据

如何在 Symfony2 中获取控制器的所有路由列表?

Symfony 5:如何从路由规则中获取选项数据

Symfony2 自定义选民:无法从选民内部访问 getDoctrine