Контроллер Symfony не может получить доступ к контейнеру

Итак, я сделал новую установку Symfony 3, пытаясь настроить несколько маршрутов API, но я не могу получить доступ к контейнеру внутри моих контроллеров.

Мой контроллер расширяется от базового контроллера Symfony, который имеет ContainerAwareTrait, но когда я пытаюсь сделать $this->container->get('service'), я получаю эту ошибку:

"message": "Call to a member function get() on null",
"class": "Component\\Debug\\Exception\\FatalThrowableError",
"trace": [{
    "namespace": "",
    "short_class": "",
    "class": "",
    "type": "",
    "function": "",
    "file": "src\\Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller.php",
    "line": 50,
    "args": []
}]

Похоже, собственный контроллер symfony не может найти контейнер, я что-то упускаю?

Вот код контроллера:

use FOS\RestBundle\Controller\Annotations\Get;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;

class UsersController extends Controller
{
    /**
     * @Get()
     *
     * @return JsonResponse
     */
    public function getUsersAction()
    {
        $users= $this->get('doctrine.orm.entity_manager')->getRepository('AppBundle:User')->findAll();

        return new JsonResponse($users, 200):
    }
}

person ChypRiotE    schedule 08.06.2017    source источник
comment
Вы определили контроллер как службу или используете стандартный механизм маршрутизации?   -  person Cerad    schedule 09.06.2017
comment
Вы пытаетесь создать экземпляр контроллера самостоятельно (например, $controller = new MyController();)?   -  person ccKep    schedule 09.06.2017
comment
Пожалуйста, покажите нам код контроллера.   -  person Matko Đipalo    schedule 09.06.2017
comment
Отредактировано для добавления кода контроллера. Я использую стандартный механизм маршрутизации, и мой контроллер расширяется от контроллера Symfony по умолчанию.   -  person ChypRiotE    schedule 10.06.2017
comment
Хм. И это все, что вы делаете? Нет конструктора? Не пытаетесь определить контроллер как службу? Не пытаетесь запустить модульный тест? Или, может быть, консольная команда? Все кажется очень загадочным.   -  person Cerad    schedule 13.06.2017
comment
Да, я создал совершенно новый контроллер, чтобы убедиться, что он не исходит от чего-то другого.   -  person ChypRiotE    schedule 14.06.2017


Ответы (3)


Наконец нашел ответ, также благодаря комментарию @Cerad: установка Symfony 3 по умолчанию создает файл services.yml и регистрирует все контроллеры как службу. Отключение этого позволило моим контроллерам получить доступ к контейнеру.

Это виновные строки:

   AppBundle\Controller\:       
        resource: '../../src/AppBundle/Controller'      
        public: true        
        tags: ['controller.service_arguments']
person ChypRiotE    schedule 14.06.2017
comment
У меня аналогичная проблема, за исключением того, что я использую DIC для внедрения сервисов в свой контроллер. Нет ли способа сделать доступным и DI, и $this-›container? Я пытаюсь работать с пользовательским пакетом FOS, но не имея доступа к контейнеру, я изо всех сил пытаюсь понять, как его использовать. - person Xopa; 18.06.2017

Попробуйте установить метод setContainer на контроллерах:

добавьте вызовы в свой контроллер в service.yml

 AppBundle\Controller\:
        resource: '../../src/YourBundle/YourController'
        public: true
        tags: ['controller.service_arguments']
        calls:
            - [setContainer, ["@service_container"]]

person rapaelec    schedule 21.06.2017

В контроллере вы можете получить доступ к контейнеру, просто используя метод get() на $this, например:

$this->get('security.token_storage')
person kRicha    schedule 09.06.2017
comment
Я не минусовал тебя, но это то, что я пытаюсь сделать, и это не работает. - person ChypRiotE; 10.06.2017
comment
@ChypRiotE ваш контроллер расширяется от Symfony\Bundle\FrameworkBundle\Controller\Controller, если да, то какую ошибку вы получаете после использования $this->get('security.token_storage') в действии вашего контроллера? - person kRicha; 10.06.2017
comment
Да, я расширяюсь от контроллера Symfony по умолчанию, ошибка, которую я получаю: Call to a member function get() on null - person ChypRiotE; 12.06.2017
comment
@ChypRiotE в вопросе, о котором вы упомянули, что вы пытаетесь использовать метод get из свойства контейнера $this, я пытаюсь сказать, что вам нужно использовать метод get непосредственно на $this. - person kRicha; 14.06.2017
comment
Я пробовал как $this->container->get, так и $this->get, но оба возвращают одну и ту же ошибку. - person ChypRiotE; 14.06.2017