Twig

灵活、快速且安全的
PHP 模板引擎

a Symfony Product
Docs 已弃用的功能
您正在阅读 Twig 3.x 的文档。切换到 Twig 1.x, 2.x 的文档。

问题与反馈

许可证

Twig 文档 基于新 BSD 许可证 授权。

已弃用的功能

本文档列出了 Twig 3.x 中已弃用的功能。已弃用的功能为了向后兼容性而保留,并在下一个主要版本中移除(在 Twig 3.x 中已弃用的功能将在 Twig 4.0 中移除)。

函数

  • twig_test_iterable 函数已弃用;请使用原生 PHP is_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 实例作为 ModuleNodeMacroNode 构造函数的主体传递已被弃用。
  • 从 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\FilterExpressionfilter 节点从 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 代替。
  • 使用 echoprint 的节点实现应使用 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_FILTERTwig\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()
    • parsePostfixExpression
    • parseSubscriptExpression
    • parseFilterExpression
    • parseFilterExpressionRaw
    • parseArguments(), 请使用 Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()
    • parseAssignmentExpression, 请使用 AbstractTokenParser::parseAssignmentExpression
    • parseMultitargetExpression
    • parseOnlyArguments(), 请使用 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 中移除。

沙箱

  • 在沙箱中默认允许 extendsuse 标签从 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 开始,将 stringarray 传递给接受箭头函数的 Twig 可调用参数已被弃用;这些参数在 4.0 中将具有 \Closure 类型提示。
  • TwigFilter::getSafe()TwigFunction::getSafe() 返回 null 从 Twig 3.16 开始已弃用;请返回 [] 代替。

节点

  • 直接实例化 Twig\Node\Node 从 Twig 3.15 开始已弃用。请根据用例使用 EmptyNodeNodes 代替。Twig\Node\Node 类将在 Twig 4.0 中变为抽象类。
  • 从 Twig 3.15 开始,不将 AbstractExpression 参数传递给以下 Node 类构造函数已被弃用

    • AbstractBinary
    • AbstractUnary
    • BlockReferenceExpression
    • TestExpression
    • DefinedTest
    • FilterExpression
    • RawFilter
    • DefaultFilter
    • InlinePrint
    • NullCoalesceExpression

运算符

  • 从 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 代替。