已弃用的功能
本文档列出了 Twig 3.x 中已弃用的功能。已弃用的功能为了向后兼容性而保留,并在下一个主要版本中移除(在 Twig 3.x 中已弃用的功能将在 Twig 4.0 中移除)。
函数
twig_test_iterable函数已弃用;请使用原生 PHPis_iterable函数代替。attribute函数从 Twig 3.15 开始已弃用。请使用.运算符代替,并将名称用括号括起来1 2 3 4 5 6 7 8 9
{# before #} {{ attribute(object, method) }} {{ attribute(object, method, arguments) }} {{ attribute(array, item) }} {# after #} {{ object.(method) }} {{ object.(method)(arguments) }} {{ array[item] }}请注意,为了实现更平滑的升级路径,它不会在 4.0 中移除。
扩展
Twig 扩展中定义的所有函数从 Twig 3.9.0 开始都标记为内部函数,并将在 Twig 4.0 中移除。它们已被各自扩展类上的内部方法取代。
如果您在代码中使用了
twig_escape_filter()函数,请使用$env->getRuntime(EscaperRuntime::class)->escape()代替。Twig\Extension\EscaperExtension中的以下方法已弃用:setEscaper(),getEscapers(),setSafeClasses,addSafeClasses()。请在Twig\Runtime\EscaperRuntime类上使用相同的方法代替之前:
$twig->getExtension(EscaperExtension::class)->METHOD();之后:
$twig->getRuntime(EscaperRuntime::class)->METHOD();
节点
Twig\Node\Node类的 "tag" 构造函数参数从 Twig 3.12 开始已弃用,因为标签现在在需要时由解析器自动设置。- 以下
Twig\Node\Node方法将在 Twig 4.0 中为其 "name" 参数接受字符串或整数(而不仅仅是字符串):getNode(),hasNode(),setNode(),removeNode(), 和deprecateNode()。 - 从 Twig 3.12 开始,不将
BodyNode实例作为ModuleNode或MacroNode构造函数的主体传递已被弃用。 - 从 Twig 3.12 开始,从
TokenParserInterface::parse()返回null已被弃用(因为接口禁止)。 Twig\Node\Expression\CallExpression::compileArguments()方法的第二个参数已弃用。Twig\Node\Expression\NameExpression::isSimple()和Twig\Node\Expression\NameExpression::isSpecial()方法从
Twig 3.11 开始已弃用,并将在 Twig 4.0 中移除。Twig\Node\Expression\FilterExpression的filter节点从 Twig 3.12 开始已弃用,并将在 4.0 中移除。请使用filter属性代替以获取过滤器之前:
$node->getNode('filter')->getAttribute('value')之后:
$node->getAttribute('twig_callable')->getName()从 Twig 3.12 开始,将名称传递给
Twig\Node\Expression\FunctionExpression,Twig\Node\Expression\FilterExpression, 和Twig\Node\Expression\TestExpression已被弃用。从 Twig 4.0 开始,您需要传递TwigFunction,TwigFilter, 或TestFilter代替。让我们以
FunctionExpression为例。如果您有一个节点扩展了
FunctionExpression并且您没有覆盖构造函数,则无需执行任何操作。但是,如果您覆盖了构造函数,则需要更改名称的类型提示,并将构造函数标记为Twig\Attribute\FirstClassTwigCallableReady属性。之前
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
class NotReadyFunctionExpression extends FunctionExpression { public function __construct(string $function, Node $arguments, int $lineno) { parent::__construct($function, $arguments, $lineno); } } class NotReadyFilterExpression extends FilterExpression { public function __construct(Node $node, ConstantExpression $filter, Node $arguments, int $lineno) { parent::__construct($node, $filter, $arguments, $lineno); } } class NotReadyTestExpression extends TestExpression { public function __construct(Node $node, string $test, ?Node $arguments, int $lineno) { parent::__construct($node, $test, $arguments, $lineno); } }之后
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
class ReadyFunctionExpression extends FunctionExpression { #[FirstClassTwigCallableReady] public function __construct(TwigFunction|string $function, Node $arguments, int $lineno) { parent::__construct($function, $arguments, $lineno); } } class ReadyFilterExpression extends FilterExpression { #[FirstClassTwigCallableReady] public function __construct(Node $node, TwigFilter|ConstantExpression $filter, Node $arguments, int $lineno) { parent::__construct($node, $filter, $arguments, $lineno); } } class ReadyTestExpression extends TestExpression { #[FirstClassTwigCallableReady] public function __construct(Node $node, TwigTest|string $test, ?Node $arguments, int $lineno) { parent::__construct($node, $test, $arguments, $lineno); } }- 以下
Twig\Node\Expression\FunctionExpression属性从 Twig 3.12 开始已弃用:needs_charset,needs_environment,needs_context,arguments,callable,is_variadic, 和dynamic_name。 - 以下
Twig\Node\Expression\FilterExpression属性从 Twig 3.12 开始已弃用:needs_charset,needs_environment,needs_context,arguments,callable,is_variadic, 和dynamic_name。 - 以下
Twig\Node\Expression\TestExpression属性从 Twig 3.12 开始已弃用:arguments,callable,is_variadic, 和dynamic_name。 MethodCallExpression类从 Twig 3.15 开始已弃用,请使用MacroReferenceExpression代替。Twig\Node\Expression\TempNameExpression类从 Twig 3.15 开始已弃用;请使用Twig代替。\Node \Expression \Variable \LocalVariable Twig\Node\Expression\NameExpression类从 Twig 3.15 开始已弃用;请使用Twig代替。\Node \Expression \Variable \ContextVariable Twig\Node\Expression\AssignNameExpression类从 Twig 3.15 开始已弃用;请使用Twig代替。\Node \Expression \Variable \AssignContextVariable - 使用
echo或print的节点实现应使用yield代替;所有节点实现都应在其类上使用#[\Twig\Attribute\YieldReady]属性,一旦它们为yield做好准备;当所有节点都使用#[\Twig\Attribute\YieldReady]属性时,可以打开use_yield环境选项。
Twig\Node\InlinePrint类从 Twig 3.16 开始已弃用,没有替代品。Twig\Node\Expression\NullCoalesceExpression类从 Twig 3.17 开始已弃用,请使用Twig代替。\Node \Expression \Binary \NullCoalesceBinary Twig\Node\Expression\ConditionalExpression类从 Twig 3.17 开始已弃用,请使用Twig代替。\Node \Expression \Ternary \ConditionalTernary
节点访问器
Twig\NodeVisitor\AbstractNodeVisitor类已弃用,请实现Twig\NodeVisitor\NodeVisitorInterface接口代替。Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_RAW_FILTER和Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_TEXT_NODES选项从 Twig 3.12 开始已弃用,并将在 Twig 4.0 中移除;它们不再执行任何操作。
解析器
Twig\Parser中的以下方法从 Twig 3.12 开始已弃用:getBlockStack(),hasBlock(),getBlock(),hasMacro(),hasTraits(),getParent()。- 从 Twig 3.12 开始,将
null传递给Twig\Parser::setParent()已被弃用。 Twig\Parser::getExpressionParser()方法从 Twig 3.21 开始已弃用,请使用Twig\Parser::parseExpression()代替。Twig\ExpressionParser类从 Twig 3.21 开始已弃用parseExpression(), 请使用Parser::parseExpression()parsePrimaryExpression(), 请使用Parser::parseExpression()parseStringExpression(), 请使用Parser::parseExpression()parseHashExpression(), 请使用Parser::parseExpression()parseMappingExpression(), 请使用Parser::parseExpression()parseArrayExpression(), 请使用Parser::parseExpression()parseSequenceExpression(), 请使用Parser::parseExpression()parsePostfixExpressionparseSubscriptExpressionparseFilterExpressionparseFilterExpressionRawparseArguments(), 请使用Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()parseAssignmentExpression, 请使用AbstractTokenParser::parseAssignmentExpressionparseMultitargetExpressionparseOnlyArguments(), 请使用Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()
令牌
- 从 Twig 3.16 开始,不将
Source实例传递给Twig\TokenStream构造函数已被弃用。 Token::getType()方法从 Twig 3.19 开始已弃用,请使用Token::test()代替。Token::ARROW_TYPE常量从 Twig 3.21 开始已弃用,箭头=>现在是一个运算符 (Token::OPERATOR_TYPE)。- 值为
(,[,|,.,?, 或?:的Token::PUNCTUATION_TYPE现在是Token::OPERATOR_TYPE类型。
模板
- 将
Twig\Template实例传递给 Twig 公共 API 已被弃用(例如在Environment::resolveTemplate(),Environment::load(), 和Template::loadTemplate()中);请传递Twig\TemplateWrapper实例代替。
过滤器
spaceless过滤器从 Twig 3.12 开始已弃用,并将在 Twig 4.0 中移除。
沙箱
- 在沙箱中默认允许
extends和use标签从 Twig 3.12 开始已弃用。如果需要在 4.0 中使用它们,您需要显式允许它们。 弃用
sandbox标签,请使用include函数的sandboxed选项代替之前
1 2 3
{% sandbox %} {% include 'user_defined.html.twig' %} {% endsandbox %}之后
1
{{ include('user_defined.html.twig', sandboxed: true) }}
测试实用工具
- 实现数据提供程序方法
Twig\Test\NodeTestCase::getTests()从 Twig 3.13 开始已弃用。请改为实现静态数据提供程序provideTests()。 - 为了使其功能可用于静态数据提供程序,
Twig\Test\NodeTestCase上的辅助方法getVariableGetter()和getAttributeGetter()已被弃用。请调用新方法createVariableGetter()和createAttributeGetter()代替。 Twig\Test\NodeTestCase::getEnvironment()方法从 Twig 3.13 开始被认为是最终方法。如果您想覆盖 Twig 环境的构造方式,请覆盖createEnvironment()代替。Twig\Test\IntegrationTestCase上的getFixturesDir()方法已弃用,请实现新的静态方法getFixturesDirectory()代替,该方法将在 4.0 中变为抽象方法。Twig\Test\IntegrationTestCase上的数据提供程序getTests()和getLegacyTests()从 Twig 3.13 开始被认为是最终方法。
环境
Twig\Environment::mergeGlobals()方法从 Twig 3.14 开始已弃用,并将在 Twig 4.0 中移除之前
1
$context = $twig->mergeGlobals($context);之后
1
$context += $twig->getGlobals();
函数/过滤器/测试
Twig 函数/过滤器/测试上的
deprecated,deprecating_package,alternative选项从 Twig 3.15 开始已弃用,并将在 Twig 4.0 中移除。请使用deprecation_info选项代替之前
1 2 3
$twig->addFunction(new TwigFunction('upper', 'upper', [ 'deprecated' => '3.12', 'deprecating_package' => 'twig/twig', ]));之后
1 2 3
$twig->addFunction(new TwigFunction('upper', 'upper', [ 'deprecation_info' => new DeprecatedCallableInfo('twig/twig', '3.12'), ]));- 对于可变参数,请使用蛇形命名法作为参数名称,以方便过渡到 4.0。
- 从 Twig 3.15 开始,将
string或array传递给接受箭头函数的 Twig 可调用参数已被弃用;这些参数在 4.0 中将具有\Closure类型提示。 - 从
TwigFilter::getSafe()和TwigFunction::getSafe()返回null从 Twig 3.16 开始已弃用;请返回[]代替。
节点
- 直接实例化
Twig\Node\Node从 Twig 3.15 开始已弃用。请根据用例使用EmptyNode或Nodes代替。Twig\Node\Node类将在 Twig 4.0 中变为抽象类。 从 Twig 3.15 开始,不将
AbstractExpression参数传递给以下Node类构造函数已被弃用AbstractBinaryAbstractUnaryBlockReferenceExpressionTestExpressionDefinedTestFilterExpressionRawFilterDefaultFilterInlinePrintNullCoalesceExpression
运算符
- 从 Twig 3.21 开始,运算符优先级必须是 [0, 512] 范围的一部分。
- 从 Twig 3.15 开始,
.运算符允许访问类常量。如果您不使用 UPPERCASE 常量名称,这可能会导致 BC 破坏。 在表达式中将
~与+或-运算符一起使用,而不使用括号来明确优先级,从 Twig 3.15 开始会触发弃用警告(在 Twig 4.0 中,+/-的优先级将高于~)。例如,以下表达式将在 Twig 3.15 中触发弃用警告
1
{{ '42' ~ 1 + 41 }}为了避免弃用警告,请将连接操作用括号括起来以明确优先级
1 2 3 4 5
{{ ('42' ~ 1) + 41 }} {# this is equivalent to what Twig 3.x does without the parentheses #} {# or #} {{ '42' ~ (1 + 41) }} {# this is equivalent to what Twig 4.x will do without the parentheses #}使用
??而不使用显式括号来明确优先级,从 Twig 3.15 开始会触发弃用警告(在 Twig 4.0 中,??将具有最低优先级)。例如,以下表达式将在 Twig 3.15 中触发弃用警告
1
{{ 'notnull' ?? 'foo' ~ '_bar' }}为了避免弃用警告,请将
??表达式用括号括起来以明确优先级1 2 3 4 5
{{ ('notnull' ?? 'foo') ~ '_bar' }} {# this is equivalent to what Twig 3.x does without the parentheses #} {# or #} {{ 'notnull' ?? ('foo' ~ '_bar') }} {# this is equivalent to what Twig 4.x will do without the parentheses #}在表达式中将
not一元运算符与*,/,//, 或%运算符一起使用,而不使用显式括号来明确优先级,从 Twig 3.15 开始会触发弃用警告(在 Twig 4.0 中,not的优先级将高于*,/,//, 和%)。例如,以下表达式将在 Twig 3.15 中触发弃用警告
1
{{ not 1 * 2 }}为了避免弃用警告,请将连接操作用括号括起来以明确优先级
1 2 3 4 5
{{ (not 1 * 2) }} {# this is equivalent to what Twig 3.x does without the parentheses #} {# or #} {{ (not 1) * 2 }} {# this is equivalent to what Twig 4.x will do without the parentheses #}在表达式中将
|运算符与+或-一起使用,而不使用显式括号来明确优先级,从 Twig 3.21 开始会触发弃用警告(在 Twig 4.0 中,|的优先级将高于+和-)。例如,以下表达式将在 Twig 3.21 中触发弃用警告
1
{{ -1|abs }}为了避免弃用警告,请添加括号以明确优先级
1 2 3 4 5
{{ -(1|abs) }} {# this is equivalent to what Twig 3.x does without the parentheses #} {# or #} {{ (-1)|abs }} {# this is equivalent to what Twig 4.x will do without the parentheses #}Twig\Extension\ExtensionInterface::getOperators()方法从 Twig 3.21 开始已弃用,请使用Twig\Extension\ExtensionInterface::getExpressionParsers()代替之前
- public function getOperators(): array {
-
- return [
-
- 'not' => [
- 'precedence' => 10, 'class' => NotUnary::class,
],
];
}
之后
- public function getExpressionParsers(): array {
-
- return [
- new UnaryOperatorExpressionParser(NotUnary::class, 'not', 10),
];
}
Twig\OperatorPrecedenceChange类从 Twig 3.21 开始已弃用,请使用Twig\ExpressionParser\PrecedenceChange代替。