Symfony容器特征

时间:2014-09-10 19:44:41

标签: php symfony containers traits

奇怪的问题, 我有控制器使用 \ Symfony \ Component \ DependencyInjection \ ContainerAwareTrait

class MainController
{
    use \Symfony\Component\DependencyInjection\ContainerAwareTrait;
    /**
     * @Route("/", name="_index")
     * @Template()
     */
    public function indexAction()
    {
         var_dump($this->container);

         return array();
    }
}

但结果为NULL。

试图:

  • Symfony 2.5。*
  • MAMP 3.0
  • PHP 5.4 5.5

我的搜索没有帮助我。我认为解决方案很简单。

有任何想法如何追踪此错误?

UPD:当我从Controller扩展时,容器可用且一切正常。但根据symfony控制器参考扩展是可选的,我可以使用特征。

1 个答案:

答案 0 :(得分:20)

我将根据对Symfony源代码的快速浏览进行猜测:您仍然需要声明您遵守ContainerAwareInterface接口。

只要Symfony在控制器上设置容器,这就是代码的样子。

if ($controller instanceof ContainerAwareInterface) {
  $controller->setContainer($this->container);
}

那么我想你需要做这样的事情:

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
// ...
class MainController implements ContainerAwareInterface 
{
    use ContainerAwareTrait;
    /**
     * @Route("/", name="_index")
     * @Template()
     */
    public function indexAction()
    {
         var_dump($this->container);

         return array();
    }

}

顺便说一句,对于Duck Typing来说,这可以说是一个非常好的例子,特别是如果他们将方法命名为更具体一些,或者在运行时检查参数类型到方法的价格更便宜