【问题标题】:Symfony container traitsSymfony 容器特征
【发布时间】:2014-11-04 14:21:45
【问题描述】:

奇怪的问题, 我有使用 \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 控制器的参考扩展是可选的,我可以使用特征来代替。

【问题讨论】:

  • 你是否设置了容器,在检查之前?
  • 我没有设置容器,symfony 做。当我从控制器扩展时,容器可用。但是根据 symfony Controller 参考,扩展 Controller 是可选的,我可以使用特性来代替。

标签: php symfony containers traits


【解决方案1】:

我会根据对 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 的一个很好的案例,特别是如果他们将方法命名为更具体的名称,或者如果在运行时检查方法的参数类型更便宜

【讨论】:

  • 谢谢,你为我节省了很多时间。
  • 您能否进一步详细说明您对 Duck Typing 的建议?恐怕听不懂。
  • @flu Symfony 作者可能已经(而不是使用instanceof)检查你的控制器是否有setContainer 方法。在某些编程语言中,这被称为“非正式协议”,或者更随意地称为“鸭子打字”(如果它像鸭子一样嘎嘎叫,假设它可以像鸭子一样处理)。 PHP 可能不是最好的语言,但我喜欢在 SO 上尽可能跨平台连接想法。我说它可能不是最好的原因是,您通常不仅要检查是否存在 setContainer 方法,还要检查它是否将正确类型的事物作为参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多