如何在TWIG函数中获取当前模板名称

时间:2012-09-29 21:54:36

标签: php symfony 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();
}

提前致谢。

3 个答案:

答案 0 :(得分:3)

对于需要回答最初问题的每个人,我找到了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();
    }

    /* ... */
最好的问候!

答案 1 :(得分:1)

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 '';
}

答案 2 :(得分:0)

$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}";

}));
Leto所述,

更新:,此方法无法在缓存(已编译)模板中运行。但是,如果您使用共享内存缓存(APC,Memcache)而不是Twig的缓存,或者在不具有高流量的环境中运行的应用程序中运行此功能(请考虑适用于员工或应用程序分支的后端应用程序仅用于收集有关应用程序代码库的信息)您可以通过禁用Twig的缓存(例如$twig = new Twig_Environment($loader, array('cache' => false));)来使其工作。在禁用Twig的缓存并使用此方法之前,请务必仔细检查您的用例,看看是否可以使用不同的方法解决该问题。