Как получить имя текущего шаблона в функции TWIG

скажем, я создал пользовательскую функцию твига: templateName.

$twig = new Twig_Environment($loader); $twig->addFunction('templateName', new Twig_Function_Function('twig_template_name', array('needs_environment' => true))); 

Есть ли способ получить имя текущего шаблона (ов) в php. Я представляю себе что-то вроде этого:

 function twig_template_name(Twig_Environment $env, $values = null) { return $env->getCurrentTemplateName(); } 

Заранее спасибо.

Related of "Как получить имя текущего шаблона в функции TWIG"

Для каждого, кто нуждается в ответе на начальный вопрос, я нашел решение, которое сама ветка использует в классе Twig_Error.

 protected function guessTemplateInfo() { $template = null; foreach (debug_backtrace() as $trace) { if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) { $template = $trace['object']; } } // update template filename if (null !== $template && null === $this->filename) { $this->filename = $template->getTemplateName(); } /* ... */ 

с наилучшими пожеланиями!

 $twig = new Twig_Environment($loader); $twig->addFunction(new Twig_SimpleFunction('twig_template_name', function() use ($twig) { $caller_template_name = $twig->getCompiler()->getFilename(); echo "This function was called from {$caller_template_name}"; })); 

ОБНОВЛЕНИЕ: как упоминалось Лето , этот метод НЕ будет работать из кэшированных (скомпилированных) шаблонов. Если, однако, вы используете кэширование общей памяти (APC, Memcache) вместо кэширования Twig или запускаете эту функцию в приложении, которая работает в среде, которая не имеет большого трафика (подумайте о вспомогательном приложении для персонала или отделения приложения, которое используется только для сбора информации о кодовой базе приложения), вы можете заставить ее работать, отключив кэширование Twig (например, $twig = new Twig_Environment($loader, array('cache' => false)); ). Обязательно внимательно изучите свой вариант использования, прежде чем отключать кеш Twig и использовать этот метод и посмотреть, сможете ли вы решить эту проблему, используя другой подход.

Решение, предложенное Mario A, не сработало для меня, но использование debug_backtrace () – отличная идея, и небольшая модификация заставила его работать с недавней версией Twig:

  private function getTwigTemplateName() { foreach (debug_backtrace() as $trace) { if (isset($trace['object']) && (strpos($trace['class'], 'TwigTemplate') !== false) && 'Twig_Template' !== get_class($trace['object']) ) { return $trace['object']->getTemplateName() . "({$trace['line']})"; } } return ''; }