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