Инъекция зависимостей Symfony2 не работает с контроллером - PullRequest
1 голос
/ 17 января 2012

Согласно 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 ]

2 голосов
/ 17 января 2012

Если вы настраиваете свои контроллеры как сервисы, вам нужно использовать немного другой синтаксис при обращении к ним в ваших маршрутах. Вместо AcmeExampleBundle:Default:index вы должны использовать acme_example.default:indexAction.

0 голосов
/ 17 января 2012

Класс Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller расширяет базовый класс ContainerAware. Этот класс содержит весь контейнер, доступный через локальное свойство $ container, поэтому вам не следует внедрять какие-либо службы в службу контроллера, поскольку вы можете получить доступ к SecurityContext через $this->container->get('security.context').

0 голосов
/ 17 января 2012

Убедитесь, что вы use Symfony\Component\Security\Core\SecurityContextInterface; в вашем контроллере. Без этого подсказка типа SecurityContextInterface в конструкторе не будет разрешена.

Кроме того, убедитесь, что ваш контроллер действительно вызывается как сервис. Ошибка, которую вы опубликовали, жалуется на то, что Ничего не было отправлено в конструктор, что звучит для меня так, будто вы используете контроллер по умолчанию. См. эту страницу поваренной книги о том, как настроить контроллер в качестве службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...