在 Symfony 2.7.10 中添加全局 Twig 过滤器需三步:编写继承 Twig_Extension 的扩展类并实现 getFilters() 和 getName(),注册为带 twig.extension 标签的服务,最后在模板中使用如 {{ 'Hello World'|truncate(5) }}。

在 Symfony 2.7.10 中添加全局 Twig 过滤器,需手动注册扩展类并配置服务,不支持注解(如 #[AsTwigFilter])——该特性从 Symfony 5.3 才引入。关键在于三步闭环:写好过滤器逻辑、封装为 Twig_SimpleFilter、通过 twig.extension 标签让容器识别。
创建 Twig 扩展类
在 src/AppBundle/Twig/ 下新建 AppExtension.php,继承 Twig_Extension(注意不是 AbstractExtension,后者是 Twig ≥ 2.0 / Symfony 3+ 的写法):
- 必须实现
getFilters()方法,返回Twig_SimpleFilter实例数组 - 推荐同时实现
getName(),返回唯一字符串(如'app_extension'),因 Symfony 2.7 仍依赖此方法识别扩展 - 过滤器方法本身建议做类型判断和空值防护,例如传入
null或非字符串时不崩溃
示例(截断过滤器):
namespace AppBundle\Twig;
use Twig_Extension;
use Twig_SimpleFilter;
class AppExtension extends Twig_Extension
{
public function getFilters()
{
return [
new Twig_SimpleFilter('truncate', [$this, 'truncateText']),
];
}
public function truncateText($text, $length = 100, $suffix = '…')
{
if (!is_string($text) || strlen($text) <= $length) {
return (string) $text;
}
return substr($text, 0, $length) . $suffix;
}
public function getName()
{
return 'app_extension';
}
}
注册为服务并打上 twig.extension 标签
打开 app/config/services.yml,添加服务定义:
app.twig_extension:
class: AppBundle\Twig\AppExtension
tags:
- { name: twig.extension }
- 类名路径必须与文件实际位置严格一致(如
AppBundle\Twig\AppExtension对应src/AppBundle/Twig/AppExtension.php) -
twig.extension标签不可省略,否则 Symfony 不会将其加载进 Twig 环境 - 无需调用
$twig->addFilter(),那是纯 Twig 环境的手动方式;Symfony 2.7 通过容器自动完成注册
验证是否生效
执行命令检查过滤器是否被识别:
-
php app/console debug:twig | grep truncate—— 应看到truncate出现在列表中 -
php app/console debug:container --tag=twig.extension—— 应列出app.twig_extension - 模板中使用:
{{ 'Hello World'|truncate(5) }}→ 输出Hello…
若报 Unknown "truncate" filter,优先检查:服务 YAML 缩进是否正确、类命名空间与文件路径是否匹配、getName() 是否存在且返回非空字符串。


















