独立PHP应用中Twig自定义rot13过滤器报未知错误求助
问题背景
在独立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

