Twig-如果启用调试模式,则显示模板名称

Twig-如果启用调试模式,则显示模板名称,twig,twig-extension,Twig,Twig Extension,我最近正在使用Twig,我想知道是否可以输出加载到页面上的模板名称。我能想到的最好的方法是将模板本身上方的名称显示为html注释 <!-- start @default/_components/_wrapper/form-wrapper.html.twig --> <form> ... </form> <!-- end @default/_components/_wrapper/form-wrapper.html.twig

我最近正在使用Twig,我想知道是否可以输出加载到页面上的模板名称。我能想到的最好的方法是将模板本身上方的名称显示为html注释

<!-- start @default/_components/_wrapper/form-wrapper.html.twig -->
    <form>
       ...
    </form>
<!-- end @default/_components/_wrapper/form-wrapper.html.twig -->

...
我知道我可以通过插入
{{{u self.templateName}}
来获得模板名,但我不想将其添加到每个模板或部分模板中

该解决方案应该适用于
{%include%}
{%use%}
等,如果它只在启用调试模式时发生,也会很好

我试图写一个扩展,但不管我怎么说,我必须在每个模板中进行某种调用

这背后的原因是,由于项目越来越大,我试图减少搜索其他人实现的模板的时间

注意:我没有使用Symfony


提前感谢,感谢您的帮助

实现这一点的最简单方法是使用您自己的
模板

<?php
    namespace My\ProjectName\Here;

    abstract class Template extends \Twig_Template {

        public function render(array $context) {
            $level = ob_get_level();
            ob_start();
            try {
                $this->display($context);
            } catch (Exception $e) {
                while (ob_get_level() > $level) {
                    ob_end_clean();
                }
                throw $e;
            }
            $content = ob_get_clean();
            return '<!-- Template  start : ' . $this->getTemplateName() . ' -->'. $content.'<!-- Template  end : ' . $this->getTemplateName() . ' -->';     
        }

多亏了@DarkBee,我被指向了正确的方向,并最终使用了以下内容:我创建了一个
debug template.class.php
,内容如下:

<?php

abstract class DebugTemplate extends Twig_Template {

    public function display(array $context, array $blocks = array())
    {
        // workaround - only add the html comment when the partial is loaded with @
        if(substr($this->getTemplateName(),0,1) == '@') {
            echo '<!-- START: ' . $this->getTemplateName() . ' -->';
        }

        $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));

        if(substr($this->getTemplateName(),0,1) == '@') {
            echo '<!-- END: ' . $this->getTemplateName() . ' -->';
        }

    }
}
?>
并添加了DebugTemplate类

$twig = new Twig_Environment($loader, array(
    'cache' => false,
    'base_template_class' => 'DebugTemplate'
));
结果正是我想要的,看起来像这样

<!-- START: @default/_components/panel.html.twig -->
        <div class="panel panel-default">
<!-- END: @default/_components/panel.html.twig -->

谢谢。另一个有用的功能是在模板中呈现现有的块开始/结束。请注意,并非所有的细枝模板都是纯HTML。HTML注释将破坏CSS或JS代码。这可以避免,例如使用命名约定

<?php
abstract class App_Twig_DebugTemplate extends Twig_Template
{
    public function display(array $context, array $blocks = [])
    {
        $this->_renderComment('BEGIN TEMPLATE: ' . $this->getTemplateName());
        $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
        $this->_renderComment('END TEMPLATE: ' . $this->getTemplateName());
    }

    public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true)
    {
        $this->_renderComment('BEGIN BLOCK: ' . $name);
        parent::displayBlock($name, $context, $blocks, $useBlocks);
        $this->_renderComment('END BLOCK: ' . $name);
    }

    /**
     * @param string $comment
     */
    private function _renderComment($comment)
    {
        $extension = pathinfo($this->getTemplateName(), PATHINFO_EXTENSION);
        if (in_array($extension, [
            'css',
            'js',
        ])) {
            echo '/* ' . $comment . ' */';
        } else {
            echo '<!-- ' . $comment . ' -->';
        }
    }
}

谢谢@DarkBee!我试过了,效果不错,但只有整个页面模板呈现了html注释。我使用了Twig_模板的
display
功能,效果非常好。唯一的“缺陷”是页面模板名称每次都会与包含/嵌入的模板一起出现。可以在Symfony中找到完全相同的内容。
<!-- START: @default/_components/panel.html.twig -->
        <div class="panel panel-default">
<!-- END: @default/_components/panel.html.twig -->
<?php
abstract class App_Twig_DebugTemplate extends Twig_Template
{
    public function display(array $context, array $blocks = [])
    {
        $this->_renderComment('BEGIN TEMPLATE: ' . $this->getTemplateName());
        $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
        $this->_renderComment('END TEMPLATE: ' . $this->getTemplateName());
    }

    public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true)
    {
        $this->_renderComment('BEGIN BLOCK: ' . $name);
        parent::displayBlock($name, $context, $blocks, $useBlocks);
        $this->_renderComment('END BLOCK: ' . $name);
    }

    /**
     * @param string $comment
     */
    private function _renderComment($comment)
    {
        $extension = pathinfo($this->getTemplateName(), PATHINFO_EXTENSION);
        if (in_array($extension, [
            'css',
            'js',
        ])) {
            echo '/* ' . $comment . ' */';
        } else {
            echo '<!-- ' . $comment . ' -->';
        }
    }
}