Контроллер базового класса с глобальным сервисом веток - PullRequest
0 голосов
/ 11 июня 2018

Прежде всего, я должен сказать, что я вижу ответы и документацию в течение нескольких дней, но никто из них не отвечает на мой вопрос.

Единственное и простое, что я хочу сделать, - это использовать веточку.Служба как глобальная служба в BaseController.

Это мой код:

<?php
namespace App\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use App\Service\Configuration;
use App\Utils\Util;


abstract class BaseController extends Controller
{

    protected $twig;
    protected $configuration;

    public function __construct(\Twig_Environment $twig,Configuration $configuration)
  {
    $this->twig = $twig;
    $this->configuration = $configuration;
  }

}

Затем во всех моих контроллерах расширяется служба веток и конфигурации, без необходимости вставлять ее снова и снова.

//...
//......

/**
 * @Route("/configuration", name="configuration_")
 */
class ConfigurationController extends BaseController
{

    public function __construct()
    {
       //parent::__construct();

       $this->twig->addGlobal('menuActual', "config");

    }

Как вы можете видеть, единственное, чего я хочу, это иметь некоторый глобальный services, чтобы все было более организованным, а также создать глобальный shortcuts для всех моих controllers.В этом примере я назначаю глобальную переменную, чтобы сделать ссылку активной в меню моего шаблона, и в каждом контроллере я должен добавить новое значение для menuActual, например, в UserController переменная будет addGlobal('menuActual', "users"),

Я думаю, что это должно быть в хороших практиках Symfony, которых я не нахожу: (.

Кажется, что нужно включить \Twig_Environment в каждом контроллере для назначения переменной представлениюочень повторяющийся для меня. Это должно прийти по умолчанию в контроллере.

Спасибо

1 Ответ

0 голосов
/ 11 июня 2018

У меня тоже была эта проблема - пытаясь не повторять немного кода для каждого контроллера / действия.

Я решил ее, используя прослушиватель событий:

# services.yaml
app.event_listener.controller_action_listener:
    class: App\EventListener\ControllerActionListener
    tags:
        - { name: kernel.event_listener, event: kernel.controller, method: onKernelController }
#src/EventListener/ControllerActionListener.php
namespace App\EventListener;

use App\Controller\BaseController;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;

/**
 * Class ControllerActionListener
 *
 * @package App\EventListener
 */
class ControllerActionListener
{
    public function onKernelController(FilterControllerEvent $event)
    {
        //fetch the controller class if available
        $controllerClass = null;
        if (!empty($event->getController())) {
            $controllerClass = $event->getController()[0];
        }

        //make sure your global instantiation only fires if the controller extends your base controller
        if ($controllerClass instanceof BaseController) {
            $controllerClass->getTwig()->addGlobal('menuActual', "config");
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...