artymail
@artymail

Как инжектировать объект $app в контроллер в Silex?

Здравствуйте.

Использую Silex. Есть свой класс провайдера контроллера:

class UserControllerProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        $user = $app["controllers_factory"];

        $user -> get ("/", "App\\Controller\\UserController::index" );

        return $user;
    }
}


Есть класс самого контроллера:
class UserController
{
    public function index()
    {
        return 1;
    }
}


Хочу в классе UserController использовать шаблонизатор Twig. Объект шаблонизатора находится в объекте $app. Как мне передать $app в UserController? Или я делаю что-то не так, раз нет решения из коробки?
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
artymail
@artymail Автор вопроса
Собственно сам и нашел ответ. Нужно немного расширить класс контроллера и можно использовать $app где пожелаешь:
use Silex\Application;

class UserController
{
    private $app;

    public function index ( Application $app )
    {
        $this -> app = $app;

        return $this -> app['twig']->render('user.twig', array(
            'user' => 1
        ));
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
akubintsev
@akubintsev
Опытный backend разработчик
Я немного автоматизировал этот процесс через kernel events
$app->on(KernelEvents::CONTROLLER, function (FilterControllerEvent $event) use ($app) {
    $c = $event->getController();
    /** @var BaseController $controller */
    $controller = $c[0];
    if ($controller instanceof BaseController) {
        $controller->injectApp($app);
    }
});

abstract class BaseController
{
    protected $app;

    public function injectApp(Application $app)
    {
        $this->app = $app;
        return $this;
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы