Symfony2依赖注入不适用于控制器

时间:2012-01-17 12:27:43

标签: php dependency-injection symfony

根据Symfony2 Cookbook我试图通过依赖注入来保护控制器,但我收到错误Catchable Fatal Error: Argument 1 passed to Acme\ExampleBundle\Controller\DefaultController::__construct() must implement interface Symfony\Component\Security\Core\SecurityContextInterface, none given, called in /var/www/example/app/cache/dev/classes.php on line 4706 and defined in /var/www/example/src/Acme/ExampleBundle/Controller/DefaultController.php line 13

这是我的services.yml

parameters:
    acme_example.default.class: Acme\ExampleBundle\Controller\DefaultController

services:
    acme_example.default:
        class: %acme_example.default.class%
        arguments: [@security.context]

和控制器:

namespace Acme\ExampleBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class DefaultController extends Controller {

    public function __construct(SecurityContextInterface $securityContext)
    {
        if(false === $securityContext->isGranted('IS_AUTHENTICATED_FULLY'))
        {
            throw new AccessDeniedException();
        }                
    }

    public function indexAction()
    {
        return new Response('OK');
    }
}

3 个答案:

答案 0 :(得分:2)

如果将控制器配置为服务,则在路由中引用它们时需要使用略有不同的语法。您应该使用AcmeExampleBundle:Default:index而不是acme_example.default:indexAction

答案 1 :(得分:0)

确保您在控制器中use Symfony\Component\Security\Core\SecurityContextInterface;。没有它,构造函数中的SecurityContextInterface类型提示将无法解析。

此外,请确保您的控制器实际上被称为服务。你发布的错误是抱怨没有被发送到构造函数,这听起来像你正在使用你的控制器'默认'方式。有关如何将控制器设置为服务,请参阅this cookbook page

答案 2 :(得分:0)

Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller类扩展了ContainerAware基类。这个类可以通过$ container本地属性访问整个容器,因此您不应该向控制器服务注入任何服务,因为您可以通过$this->container->get('security.context')访问SecurityContext。