You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

独立PHP应用中Twig自定义rot13过滤器报未知错误求助

Twig自定义过滤器/函数提示“Unknown”的解决方法

问题背景

在独立PHP应用中使用Twig 3.6版本,通过Composer引入依赖"twig/twig": "^3.6",初始化代码如下:

$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader, [
    'cache' => 'tmp/cache',
]);

$twig->addFilter(new \Twig\TwigFilter('rot13', function ($string) {
    return str_rot13($string);
}));

但在模板中使用{{ 'MYNAME' | rot13 }}时,提示Unknown "rot13" filter错误,自定义函数也出现类似问题,报错堆栈信息如下:

Unknown "rot13" filter. [/myfiles/templates/tester.html:26]

[vendor/twig/twig/src/ExpressionParser.php:562] Twig\ExpressionParser->getFilterNodeClass('rot13',26)
[vendor/twig/twig/src/ExpressionParser.php:547] Twig\ExpressionParser->parseFilterExpressionRaw(TwigNodeExpressionConstantExpression::__set_state([]))
[vendor/twig/twig/src/ExpressionParser.php:405] Twig\ExpressionParser->parseFilterExpression(TwigNodeExpressionConstantExpression::__set_state([]))
[vendor/twig/twig/src/ExpressionParser.php:288] Twig\ExpressionParser->parsePostfixExpression(TwigNodeExpressionConstantExpression::__set_state([]))
[vendor/twig/twig/src/ExpressionParser.php:177] Twig\ExpressionParser->parsePrimaryExpression()
[vendor/twig/twig/src/ExpressionParser.php:72] Twig\ExpressionParser->getPrimary()
[vendor/twig/twig/src/Parser.php:127] Twig\ExpressionParser->parseExpression()
[vendor/twig/twig/src/TokenParser/ForTokenParser.php:42] Twig\Parser->subparse([TwigTokenParserForTokenParser::__set_state([]),'decideForFork'])
[vendor/twig/twig/src/Parser.php:170] Twig\TokenParser\ForTokenParser->parse(TwigToken::__set_state([]))
[vendor/twig/twig/src/TokenParser/BlockTokenParser.php:47] Twig\Parser->subparse([TwigTokenParserBlockTokenParser::__set_state([]),'decideBlockEnd'],true)
[vendor/twig/twig/src/Parser.php:170] Twig\TokenParser\BlockTokenParser->parse(TwigToken::__set_state([]))
[vendor/twig/twig/src/Parser.php:83] Twig\Parser->subparse(NULL,false)
[vendor/twig/twig/src/Environment.php:491] Twig\Parser->parse(TwigTokenStream::__set_state([]))
[vendor/twig/twig/src/Environment.php:519] Twig\Environment->parse(TwigTokenStream::__set_state([]))
[vendor/twig/twig/src/Environment.php:351] Twig\Environment->compileSource(TwigSource::__set_state([]))
[vendor/twig/twig/src/Environment.php:312] Twig\Environment->loadTemplate('__TwigTemplate_9fcd4d27f601c5dddfd436979e4446b0','admin/classlist.html')

解决方法

  • 清理Twig缓存:Twig会编译模板并缓存到tmp/cache目录,旧缓存不会自动更新新添加的过滤器。直接删除tmp/cache下的所有文件,或者开发阶段临时关闭缓存:
    $twig = new \Twig\Environment($loader, [
        'cache' => false, // 开发环境关闭缓存,生产环境恢复为缓存路径
    ]);
    
  • 确认Twig实例统一:检查渲染模板的代码,确保调用$twig->render()的是你添加了过滤器的那个实例,不要在渲染前重新初始化Twig对象。
  • 检查命名空间/加载器配置:如果模板使用了命名空间加载,确认过滤器是添加到对应环境中,且模板没有使用未配置过滤器的其他加载器。

内容的提问来源于stack exchange,提问作者Ayman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 19:45:15