几个月前,我遇到了和你一样的问题,“谷歌搜索”我找到了一个工作代码,我已经根据我的需要对其进行了调整。开始了:
1 -我们需要为此定义一个 TWIG 扩展。如果您尚未定义,我们将创建文件夹结构Your\OwnBundle\Twig\Extension 。
2 -在这个文件夹中,我们创建文件ControllerActionExtension.php,代码是:
namespace Your\OwnBundle\Twig\Extension;
use Symfony\Component\HttpFoundation\Request;
/**
* A TWIG Extension which allows to show Controller and Action name in a TWIG view.
*
* The Controller/Action name will be shown in lowercase. For example: 'default' or 'index'
*
*/
class ControllerActionExtension extends \Twig_Extension
{
/**
* @var Request
*/
protected $request;
/**
* @var \Twig_Environment
*/
protected $environment;
public function setRequest(Request $request = null)
{
$this->request = $request;
}
public function initRuntime(\Twig_Environment $environment)
{
$this->environment = $environment;
}
public function getFunctions()
{
return array(
'get_controller_name' => new \Twig_Function_Method($this, 'getControllerName'),
'get_action_name' => new \Twig_Function_Method($this, 'getActionName'),
);
}
/**
* Get current controller name
*/
public function getControllerName()
{
if(null !== $this->request)
{
$pattern = "#Controller\\\([a-zA-Z]*)Controller#";
$matches = array();
preg_match($pattern, $this->request->get('_controller'), $matches);
return strtolower($matches[1]);
}
}
/**
* Get current action name
*/
public function getActionName()
{
if(null !== $this->request)
{
$pattern = "#::([a-zA-Z]*)Action#";
$matches = array();
preg_match($pattern, $this->request->get('_controller'), $matches);
return $matches[1];
}
}
public function getName()
{
return 'your_own_controller_action_twig_extension';
}
}
3 -之后,我们需要指定要识别的 TWIG 服务:
services:
your.own.twig.controller_action_extension:
class: Your\OwnBundle\Twig\Extension\ControllerActionExtension
calls:
- [setRequest, ["@?request="]]
tags:
- { name: twig.extension }
4 -清除缓存以确保一切正常:
php app/console cache:clear --no-warmup
5 -现在,如果我没有忘记任何事情,您将能够在 TWIG 模板中访问这两种方法:get_controller_name()
和get_action_name()
6 -示例:
You are in the {{ get_action_name() }} action of the {{ get_controller_name() }} controller.
这将输出如下内容:您处于默认控制器的索引操作中。
您还可以用来检查:
{% if get_controller_name() == 'default' %}
Whatever
{% else %}
Blablabla
{% endif %}
就这样!!我希望我能帮助你,伙计:)
编辑:注意清除缓存。如果您不使用--no-warmup
参数,您可能会意识到模板中没有显示任何内容。那是因为这个 TWIG 扩展使用请求来提取控制器和动作名称。如果你“预热”缓存,Request 与浏览器请求不同,方法可以返回''
或null