Много месяцев назад у меня было то же самое как вы, и «googling», я нашел рабочий код, и я адаптировал его к моим потребностям. Здесь мы идем:
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 - И теперь, если я ничего не пропущено, вы сможете получить доступ к этим 2 метода в шаблоне 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 Extension использует запрос для извлечения имен Controller и Action. Если вы «разогреть» кэш, то запрос не то же самое как запрос браузера и методы могут возвращать ''
или null
Но зачем вам нужна эта информация? – j0k
Я хочу добавить класс к некоторым ссылкам на имя контроллера. –