4

假设我创建了一个自定义 twig 函数:templateName。

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

有没有办法在 php.ini 中获取当前模板的名称。我想象这样的事情:

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

提前致谢。

4

3 回答 3

4

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

    /* ... */

最好的祝福!

于 2012-09-30T12:19:57.833 回答
3

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 '';
}
于 2017-06-20T09:13:23.057 回答
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 的缓存并使用此方法之前,请务必仔细检查您的用例,看看您是否可以使用不同的方法解决该问题。

于 2014-10-20T18:18:45.090 回答