查不到自定义过滤器,先确认服务是否注册成功:运行debug:container --tag=twig.extension看类名是否存在,再在getfilters()中加die验证执行,最后检查类路径与命名空间是否匹配。

debug:twig --filter 查不到自定义过滤器?先确认注册状态
运行 php bin/console debug:twig --filter=xxx 查不到你写的过滤器,大概率不是命令用错,而是服务没注册成功。这个命令只显示 Twig 已加载的过滤器,不关心类文件是否存在。
必须先验证两件事:
- 服务是否被容器识别:
php bin/console debug:container --tag=twig.extension—— 输出里要有你的扩展类名,否则debug:twig根本看不到它 - 扩展类是否真返回了过滤器:在
getFilters()方法里加个die('here');,再跑一次命令,确认方法确实被执行 - 类路径和命名空间是否匹配:比如类声明为
App\Twig\TextExtension,但文件放在src/Twig/MyTextExtension.php,自动发现会失败
debug:twig 不显示内置函数?检查是否被禁用或覆盖
debug:twig --filter=date 或 --filter=url 能查到常见函数,但如果你发现 form_start、asset 这类函数不出现,不是命令失效,而是它们属于 Twig 扩展包(如 TwigBridge),需要对应组件已启用。
典型原因有:
-
symfony/form未安装 →form_*函数不会注册 -
symfony/asset未启用 →asset()不可见 - 某个 Bundle 的扩展类抛出异常(比如构造函数里用了未注入的 service),导致整个扩展被跳过 —— 此时
debug:container --tag=twig.extension也看不到它
想看所有可用过滤器和函数,别只靠 --filter
--filter 是模糊搜索,容易漏掉名字不直观的项(比如 trans 实际注册为 trans,但有人会搜 translate)。更可靠的方式是直接列出全部:
php bin/console debug:twig | grep -E '^[a-z]' —— 过滤掉标题行,只留函数/过滤器名
或者用原生命令导出结构化结果:
php bin/console debug:twig --format=json | jq '.filters + .functions | keys[]'(需装 jq)
注意:debug:twig 输出的列表里,filters 和 functions 是分开的两个数组,不要混着比对。
debug:twig 显示“unknown filter”但代码里明明写了?检查拼写和环境
模板里写 {{ user.name|price_format }} 报错 “Unknown filter”,而 debug:twig --filter=price_format 却能查到 —— 这种矛盾通常源于:
- 开发环境是
dev,但当前请求走的是prod环境缓存(比如访问地址带app.php),导致 Twig 没加载 dev-only 的扩展 - 过滤器名大小写不一致:PHP 类方法是
formatPrice(),但TwigFilter构造时传的是'priceFormat',模板里却写成|price_format - 扩展类继承了
AbstractExtension,但没实现getFilters()(比如误写成getFilter()),PHP 不报错,但返回空数组
最省事的验证方式:临时在模板里加一行 {{ dump(app.environment) }},确认当前确实是 dev 环境。











