Symfony3.4 Twig模板添加渲染调试追踪的base_template_class配置问题
Symfony 3.4 无侵入实现Twig模板溯源方案
问题根因排查
- 类自动加载失败:你将DebugTemplate放在templates目录下,该目录仅用于存储Twig模板文件,不属于Symfony 3.4默认的PSR-4自动加载路径,因此PHP无法找到该类,缓存中也不会出现相关加载记录。
- base_template_class配置格式错误:该参数仅接受完全限定类名(FQCN),不支持传入文件路径、相对类名或数组格式,你之前的配置写法全部不符合参数要求。
具体实现步骤
1. 调整DebugTemplate存放位置与代码
将DebugTemplate文件移动到src/AppBundle/Twig/DebugTemplate.php,写入以下代码:
<?php namespace AppBundle\Twig; abstract class DebugTemplate extends \Twig_Template { /** * 重写display方法,在模板渲染前后插入隐藏追踪标签 */ public function display(array $context, array $blocks = []) { echo sprintf('<trace twig="%s" type="template" action="start" style="display:none"></trace>', htmlspecialchars($this->getTemplateName())); parent::display($context, $blocks); echo sprintf('<trace twig="%s" type="template" action="end" style="display:none"></trace>', htmlspecialchars($this->getTemplateName())); } /** * 重写displayBlock方法,在block渲染前后插入隐藏追踪标签 */ public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true) { echo sprintf('<trace twig="%s" block="%s" type="block" action="start" style="display:none"></trace>', htmlspecialchars($this->getTemplateName()), htmlspecialchars($name)); parent::displayBlock($name, $context, $blocks, $useBlocks); echo sprintf('<trace twig="%s" block="%s" type="block" action="end" style="display:none"></trace>', htmlspecialchars($this->getTemplateName()), htmlspecialchars($name)); } }
2. 正确配置base_template_class参数
建议仅在开发环境开启该功能,因此修改app/config/config_dev.yml,添加以下配置:
twig: base_template_class: AppBundle\Twig\DebugTemplate
3. 清空Symfony缓存
Twig模板编译缓存不会自动识别基础模板类的变更,必须手动清空缓存才会重新编译所有模板:
php bin/console cache:clear --env=dev
效果验证
清缓存后访问任意页面,查看页面源码即可看到所有Twig模板、block的渲染位置都插入了隐藏的
注意事项
- 不要将该配置放到生产环境的配置文件中,避免泄露模板路径信息
- 若项目中存在第三方Bundle自定义了Twig基础模板类,需将DebugTemplate的父类替换为对应自定义类即可兼容
内容的提问来源于stack exchange,提问作者LanderTaker
相关产品推荐
相关产品推荐

