2011-10-10 204 views
1

我有一个关于Symfony2控制器扩展的问题。目前,我一直在为我的应用程序中的每个控制器扩展一个FrameworkBundle。但我通过制作Symfony2:扩展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(); 
    } 
} 

我无法加载$这个 - > EM和$这个 - >用户自容器__construct()函数不是在施工时加载。

所以我的问题是:

  • 那是一个好主意,或者我应该继续做详细的电话?
  • 只是创建可以完成同样工作的函数getEm()和getUser()会更好吗?

谢谢!

回答

0

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

+0

好主意,我会做同样的:) – Nanocom

+0

这里是摘录: 'public function getEm(){ return $ this-> getDoctrine() - > getEntityManager(); } public function getRepository($ shortEntityName){ return $ this-> getEm() - > getRepository(“SicoStockBundle:$ shortEntityName”); }' –

4

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

供参考,这是我的getUser方法:

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

好吧,这就是我的想法。这是不是创建“RootBundle”的好主意? – Nanocom

+0

您可以,但我将自定义控制器保留在供应商目录中。我没有看到需要把它放在自己的包中。无论哪种方式应该工作得很好,所以归结为个人偏好。 –

0

另一种选择是你定义控制器为服务,并指定什么获取传递给你的构造函数,以任何你想要的私有变量,但下跌空间可能你不会喜欢这条路线需要的所有设置

0

你可以注入的EntityManager(或任何其他服务),即使没有控制器extantion为:

use JMS\DiExtraBundle\Annotation as DI; 

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