Symfony2:扩展FrameworkBundle控制器

时间:2011-10-10 21:13:30

标签: controller symfony

我有一个关于Symfony2 Controller扩展的问题。目前,我总是为我的应用程序中的每个控制器扩展FrameworkBundle。但我厌倦了总是通过制作

来检索用户
$this->get('security.context')->getToken()->getUser()

$this->getDoctrine()->getEntityManager()

每次我需要用户或实体经理(我需要他们很多)。我希望能够通过执行$ this-> em和$ this-> user来检索它们。 所以我决定创建一个名为MyApp / RootBundle的包,它包含一个扩展FrameworkBundle的新控制器。该控制器将由应用程序中的每个其他控制器进行扩展。这是代码:

<?php

namespace MyApp\RootBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\DependencyInjection\ContainerInterface;

class RootController extends Controller
{
    protected $em;

    protected $user;

    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer($container);

        $this->onContainerSet();
    }

    public function onContainerSet()
    {
        $this->em = $this->getDoctrine()->getEntityManager();
        $this->user = $this->get('security.context')->getToken()->getUser();
    }
}

我无法在__construct()函数中加载$ this-&gt; em和$ this-&gt;用户,因为在构造时未加载容器。

所以我的问题是:

  • 这是一个好主意还是我应该继续进行详细的通话?
  • 创建能完成同样工作的函数getEm()和getUser()会不会更好?

谢谢!

4 个答案:

答案 0 :(得分:4)

我遇到了同样的问题,我刚刚创建了一个具有getUser()getEntityManager()方法的自定义控制器。它完美地运作。在这种情况下,我建议使用getter方法而不是类实例,以便与Symfony2期望您请求服务的方式保持一致。

作为参考,这是我的getUser方法:

public function getUser() {
        $user = $this->get('security.context')->getToken()->getUser();
        return $user;
}

答案 1 :(得分:0)

另一种选择是将控制器定义为服务并将传递给构造函数的内容分配给您希望的任何私有变量,但缺点可能是您不喜欢此路由所需的所有设置

答案 2 :(得分:0)

我创建了一个MyController,但也创建了一个MyRepository。然后所有控制器和存储库都扩展了这些类。 我也叫$ this-&gt; getRepository(“User”),而不是$ this-&gt; getDocrine() - &gt; getEntityManager() - &gt; getrepository(“MyappBundle:User”);

答案 3 :(得分:0)

即使没有控制器扩展,您也可以注入EntityManager(或任何其他服务):

use JMS\DiExtraBundle\Annotation as DI;

    class IndexController extends Controller 
    {  
       /**
         * @DI\Inject("doctrine.orm.entity_manager")
         * @var \Doctrine\ORM\EntityManager $em
         */
        protected $em;