Symfony 2 и 3. Как использовать сервис-контейнер в конструкторе контроллера

Бывают ситуации, когда в конструкторе контроллера нужно вызвать сервис-контейнер, но выводится ошибка:

Error: Call to a member function get() on null

in vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Controller/Controller.php at line 350

Есть простое решение данной проблемы.

Пользовательский контроллер наследуется от класса Controller, а тот в свою очередь — от класса ContainerAware. В классе ContainerAware есть метод setContainer. Чтобы вызвать сервис-контейнер и присвоить его полю вашего контроллера, нужно переопределить метод setContainer:

<?php

namespace AppBundle\Controller;

use Symfony\Component\DependencyInjection\ContainerInterface;

class DefaultController extends Controller
{
    protected $myService;
    /*
     * Конструктор в контроллерах не поддерживает сервис-контейнер
     * поэтому вместо конструктора вызываем метод setContainer()
     * */

    public function setContainer(ContainerInterface $container = null)
    {
        parent::setContainer($container);
        $this->myService = $this->get('my.service');
    }
}

 

Точно работает в версиях Symfony 2.7, 2.8, 3.0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code