Symfony 2 Controller即服务:未注入容器

时间:2013-08-25 07:48:28

标签: unit-testing symfony dependency-injection controller

我希望能够将服务注入到我的控制器中,所以我查看了http://symfony.com/doc/current/cookbook/controller/service.html并且在对符号进行了一些调整之后(可能会更加一致但是无论如何)我使用该服务的WebTestCase定义条目。

但是控制器需要注入容器(并且确实通过默认框架控制器扩展ContainerAware),而FrameworkBundle中的ControllerResolver不会这样做。

查看代码(Symfony \ Bundle \ FrameworkBundle \ Controller \ ControllerResolver :: createController())这并不令人惊讶:

protected function createController($controller)
{
    if (false === strpos($controller, '::')) {
        $count = substr_count($controller, ':');
        if (2 == $count) {
            // controller in the a:b:c notation then
            $controller = $this->parser->parse($controller);
        } elseif (1 == $count) {
            // controller in the service:method notation
            list($service, $method) = explode(':', $controller, 2);

            return array($this->container->get($service), $method);
        } else {
            throw new \LogicException(sprintf('Unable to parse the controller name "%s".', $controller));
        }
    }

    list($class, $method) = explode('::', $controller, 2);

    if (!class_exists($class)) {
        throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
    }

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

    return array($controller, $method);
}

显然当使用service:method notation时,它直接从容器中返回控制器,而不是注入容器本身。

这是一个错误还是我错过了什么?

1 个答案:

答案 0 :(得分:0)

这不是错误。它按预期工作。这个工作流程通常会保护" Controller as a Service概念。这样您需要将Controller视为常规Service。在常规Service中,您可以注入所需的一切 - 如果您需要控制器本身 - 明确地注入它。

为了更清楚地解释它,这个"保护"我提到有助于避免在一个地方使用service:method表示法,而在另一个地方使用controller::methodbundle:controller:method

所以,如果没有这个"保护"很难说明特定的Controller是否被描述为服务,因为这将取决于Container构建中首先调用哪个符号。