调试 Twig 模板
Twig 模板引擎提供了一个调试工具。
Drupal 8 的实现还添加了一个额外的工具,可以帮助你找到输出标记的模板。
警告:启用 Twig 调试可能会破坏站点的某些部分,尤其是 Views。请查看此问题。
启用调试
你可以在 sites/default/services.yml 中启用 Twig 调试。
将 debug 变量设置为 true,然后清除缓存。
parameters:
twig.config:
debug: true
- 如果
services.yml尚不存在,请将default.services.yml复制为services.yml。 - 如果 Drupal 已经安装,可能需要临时更改
sites/default目录的权限以允许写入。 - 如何更改目录权限
- 在创建并编辑
services.yml之后,请将权限改回以锁定sites/default目录。
检查调试
如果你使用 Firefox 的 Firebug,请确保“显示注释”(Show Comments) 已启用,或者直接查看页面源代码:

自动重新加载
Twig 模板会被编译成磁盘上的 PHP 类以提高性能,但这意味着默认情况下模板不会在更改时自动更新。不要在生产环境中启用此功能。
要手动重建模板,请运行 drush cr。为了在开发时节省时间,可以通过在 services.yml 中设置 twig.config.auto_reload: true 来启用自动重新加载(默认情况下,当 twig.config.debug: true 时,自动重新加载会启用)。
更多信息请参阅 https://drupal.org/node/1903374。
查看变量
查看变量的最佳方法是使用 Xdebug。
如果你使用下面提到的非 Xdebug 方法,会遇到大量递归渲染操作,可能生成一堆对你无用的信息。
最常推荐的方法是使用 PHPstorm 与 Xdebug,因为配置最容易,不过几乎所有 IDE 都有 Xdebug 插件。如果你需要一个免费且轻量的编辑器,微软的 VSCode 是一个开源选项,它有 PHP 和 Xdebug 插件。
配置 Xdebug
Xdebug 的配置可能比较复杂,所以一定要阅读你 IDE 插件的说明,并查看 Xdebug 的文档。单纯依赖网上的说明和错误报告没用,如果你针对的是错误的环境(例如 Xdebug 在 Vagrant、Virtualbox 或 Docker 中),你可能需要“远程”连接的配置:https://xdebug.org/docs/remote。
Drupal.org 提供了针对不同编辑器的 Xdebug 指南,可以在这里找到:https://www.drupal.org/docs/develop/development-tools/xdebug-debugger
使用 Xdebug 时:
有三种方式可以在 Twig 模板中设置断点,让你的 IDE 显示 PHP 环境中的变量和其他状态信息:
{{ devel_breakpoint() }}
- 使用 Twig Xdebug 模块
{{ breakpoint() }}
如果你无法安装 Xdebug …
……继续往下读,祝你好运。
{{ dump() }}
{{ dump(variable_name) }}
可用的变量列表(顶层):
{{ dump(_context|keys) }}
如果你有 Devel kint 子模块(需要用 Composer 的 require-dev 安装:composer require --dev drupal/devel 1.0-alpha1,然后用 Drush 安装:drush -y en kint),你可以更友好地查看可用的变量:
{{ kint() }}
很有可能当渲染结果很大时,kint 会让你的浏览器卡死。这种情况下,以下模块可能更适合你:
或者你可以使用 Vardumper Twig 模块,它在 twig 中提供 Vardumper。你可以更清晰地查看 twig 中可用的变量:
{{ dump() }}
{{ dump(variable_name) }}
{{ vardumper() }}
{{ vardumper(variable_name) }}
……不过也要考虑花上一两个小时让 Xdebug 正常运行,这会让你的生活轻松很多,因为你需要知道可以使用哪些变量。
如果你使用了错误的范式 …
如果你在模板中写了很多逻辑代码,你应该考虑是否真的需要在这一层做复杂的操作。比如:是否更适合复制一个已有的字段格式化插件文件到自定义模块(保持相同的路径结构),然后仅仅修改注解(头部注释,也叫插件名)和 PHP/HTML 代码,在那里实现你的需求。Drupal 8 的插件就是一些位于特定文件夹中的单独文件,使用起来非常简单。
更多调试选项可见 下一节。