我正在使用Symfony2.3
我正在使用EntityManager,如 __ construct()
使用来自 __ construct()的EntityManager或在每个方法中使用它是更好的方法吗?如 public indexAction()
所示/**
* QuazBar controller.
*
*/
class QuazBarController extends Controller
{
public function __construct()
{
$this->em = $GLOBALS['kernel']->getContainer()->get('doctrine')->getManager();
}
/**
* Lists all QuazBar entities.
*
*/
public function indexAction(Request $request)
{
$session = $request->getSession();
$pagina = $request->query->get('page', 1);
$em = $this->getDoctrine()->getManager();
}
答案 0 :(得分:10)
如果必须在构造函数中有EntityManager
,那么获取它的好方法是将它注入构造函数。
为此,您必须定义controller as a service。
# src/Acme/DemoBundle/Resources/config/services.yml
parameters:
# ...
acme.controller.quazbar.class: Acme\DemoBundle\Controller\QuazBarController
services:
acme.quazbar.controller:
class: "%acme.controller.quazbar.class%"
# inject doctrine to the constructor as an argument
arguments: [ @doctrine.orm.entity_manager ]
现在你要做的就是修改你的控制器:
use Doctrine\ORM\EntityManager;
/**
* QuazBar controller.
*
*/
class QuazBarController extends Controller
{
public function __construct(EntityManager $em)
{
$this->em = $em;
}
// ...
}
如果构造函数中不需要Entity Manager
,则可以使用控制器中任何方法的依赖注入容器来获取它:
$this->getDoctrine()->getManager();
OR
$this->container->get('doctrine')->getManager();
控制器/设置器注入是一个不错的选择,因为您没有将控制器实现耦合到DI容器。
最后,您使用的是符合您需求的。
答案 1 :(得分:0)
在symfony 2.3中,我认为与doctrine实体管理器的连接已构建到控制器类中。
$em = $this->getDoctrine()->getManager();
最佳做法是在需要时在控制器中进行此调用。如果它只是方便,你可以派生一个控制器类,并添加像getEm(),如果你觉得太可恶。
通常,您自己的控制器类是一个好主意,因为它会限制安全性并使您的代码更加干燥。
答案 2 :(得分:0)
我们可以在控制器类中定义构造函数吗?该学说是一项服务。在构造函数中获取学说或者在任何想要的地方获取它都是有意义的。两种方式都可以获得相同的服务。为什么要注入已经注入的em。