Symfony 具有全局分支服务的基类控制器

Symfony 具有全局分支服务的基类控制器,symfony,Symfony,首先,我必须说,我已经看到答案和文档好几天了,但没有一个能回答我的问题 我想做的唯一简单的事情是在BaseController中将细枝服务用作全局服务 这是我的代码: <?php namespace App\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use App\Serv

首先,我必须说,我已经看到答案和文档好几天了,但没有一个能回答我的问题

我想做的唯一简单的事情是在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;
  }

}
正如您所看到的,我唯一想要的是拥有一些
服务
全局,以使一切更加有序,并为我所有的
控制器创建一些全局
快捷方式
。在本例中,我分配了一个全局变量,以使链接在模板的菜单中处于活动状态,并且在每个控制器中,我必须为
menuActual
添加一个新值,例如在
UserController
中,变量将是
addGlobal('menuActual',“users”)

我认为这应该是symfony的良好实践,但我没有发现:(

必须在每个控制器中包含
\Twig\u环境
,才能为视图分配变量,这在我看来是非常重复的。默认情况下,这应该出现在控制器中


谢谢

我也遇到了这个问题-尽量不必为每个控制器/操作重复一点代码

我使用事件侦听器解决了这个问题:

#services.yaml
app.event\u listener.controller\u action\u listener:
类:App\EventListener\ControllerActionListener
标签:
-{name:kernel.event_侦听器,事件:kernel.controller,方法:onKernelController}
#src/EventListener/ControllerActionListener.php
名称空间App\EventListener;
使用App\Controller\BaseController;
使用Symfony\Component\HttpKernel\Event\FilterControllerEvent;
/**
*类ControllerActionListener
*
*@package-App\EventListener
*/
类ControllerActionListener
{
内核控制器上的公共函数(FilterControllerEvent$事件)
{
//获取控制器类(如果可用)
$controllerClass=null;
如果(!empty($event->getController())){
$controllerClass=$event->getController()[0];
}
//确保全局实例化仅在控制器扩展基本控制器时触发
if($controllerClass instanceof BaseController){
$controllerClass->getTwig()->addGlobal('menuActual','config');
}
}
}

谢谢。是的,我发现,问题是在每个控制器中,我必须为
menuActual
添加一个新值,例如在
UserController
中,变量将是
addGlobal('menuActual',“users”)
,因此您的示例无法完全解决我的问题。您可以在扩展
BaseController
的类上设置属性或方法来处理特定于类的部分。然后事件侦听器使用/调用该属性或方法来触发它。如果您使用方法,则可以在基本控制器中将其定义为抽象,以确保扩展类这是一个好主意,让我试试,如果我有任何问题,我会告诉你。非常感谢。最后还是一样,或者我想我不知道,因为我必须在所有地方添加
\Twig\u环境$Twig
,并且在
侦听器中
$controllerClass->setTwig()
向我询问Twig参数:(您不必-哪个位是基于控制器的特定动态位?进入
addGlobal()
的变量名和值?
//...
//......

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

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

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

    }