根据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');
}
}
答案 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。