gpt4 book ai didi

symfony - 具有全局 Twig 服务的基类 Controller

转载 作者:行者123 更新时间:2023-12-05 04:05:46 24 4
gpt4 key购买 nike

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

我想做的唯一简单的事情就是将 twig 服务用作 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;
}

}

然后在我所有的 Controller 中扩展 Twig 和配置服务,而无需一次又一次地注入(inject)它。

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

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

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

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

}

如你所见,我唯一想要的就是拥有一些全局的服务,让一切更有条理,并为我所有的创建一些全局的快捷方式 Controller 。在这个例子中,我分配了一个全局变量,使链接在我的模板菜单中处于事件状态,并且在每个 Controller 中,我必须为 menuActual 添加一个新值,例如在 UserController 变量将是 addGlobal('menuActual', "users")

我认为这应该是我找不到的 symfony 的良好实践:(。

必须在每个 Controller 中包含 \Twig_Environment 才能将变量分配给 View ,这对我来说似乎非常重复。这应该在 Controller 中默认出现。

谢谢

最佳答案

我也遇到过这个问题 - 尽量不必为每个 Controller /操作重复一些代码。

我使用事件监听器解决了它:

# 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");
}
}
}

关于symfony - 具有全局 Twig 服务的基类 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50791349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com