Características Obsoletas

Este documento enumera las características obsoletas en Twig 3.x. Las características obsoletas se mantienen por compatibilidad hacia atrás y se eliminan en la próxima versión principal (una característica que quedó obsoleta en Twig 3.x se elimina en Twig 4.0).

Funciones

  • La función twig_test_iterable está obsoleta; usa la función nativa de PHP is_iterable en su lugar.
  • La función attribute está obsoleta a partir de Twig 3.15. Usa el operador . en su lugar y envuelve el nombre con paréntesis:
{# antes #}
{{ attribute(object, method) }}
{{ attribute(object, method, arguments) }}
{{ attribute(array, item) }}

{# después #}
{{ object.(method) }}
{{ object.(method)(arguments) }}
{{ array[item] }}

Ten en cuenta que no se eliminará en 4.0 para permitir una transición más suave.

Extensiones

  • Todas las funciones definidas en las extensiones de Twig se marcan como internas a partir de Twig 3.9.0, y se eliminarán en Twig 4.0. Han sido reemplazadas por métodos internos en sus respectivas clases de extensión.

    Si estabas usando la función twig_escape_filter() en tu código, usa $env->getRuntime(EscaperRuntime::class)->escape() en su lugar.

  • Los siguientes métodos de Twig\Extension\EscaperExtension están obsoletos: setEscaper(), getEscapers(), setSafeClasses, addSafeClasses(). Usa los mismos métodos en la clase Twig\Runtime\EscaperRuntime en su lugar:

    Antes: $twig->getExtension(EscaperExtension::class)->METHOD();

    Después: $twig->getRuntime(EscaperRuntime::class)->METHOD();

Nodos

  • El parámetro constructor "tag" de la clase Twig\Node\Node está obsoleto a partir de Twig 3.12, ya que la etiqueta ahora se establece automáticamente por el Parser cuando es necesario.

  • Los siguientes métodos Twig\Node\Node tomarán una cadena o un entero (en lugar de solo una cadena) en Twig 4.0 para su argumento "name": getNode(), hasNode(), setNode(), removeNode(), y deprecateNode().

  • No pasar una instancia BodyNode como cuerpo de un constructor ModuleNode o MacroNode está obsoleto a partir de Twig 3.12.

  • Devolver null desde TokenParserInterface::parse() está obsoleto a partir de Twig 3.12 (como prohibido por la interfaz).

  • El segundo argumento del método Twig\Node\Expression\CallExpression::compileArguments() está obsoleto.

  • Los métodos Twig\Node\Expression\NameExpression::isSimple() y Twig\Node\Expression\NameExpression::isSpecial() están obsoletos a partir de Twig 3.11 y se eliminarán en Twig 4.0.

  • El nodo filter de Twig\Node\Expression\FilterExpression está obsoleto a partir de Twig 3.12 y se eliminará en 4.0. Usa el atributo filter en su lugar para obtener el filtro:

    Antes: $node->getNode('filter')->getAttribute('value')

    Después: $node->getAttribute('twig_callable')->getName()

  • Pasar un nombre a Twig\Node\Expression\FunctionExpression, Twig\Node\Expression\FilterExpression, y Twig\Node\Expression\TestExpression está obsoleto a partir de Twig 3.12. A partir de Twig 4.0, necesitas pasar un TwigFunction, TwigFilter, o TestFilter en su lugar.

    Tomemos un FunctionExpression como ejemplo.

    Si tienes un nodo que extiende FunctionExpression y si no anulas el constructor, no necesitas hacer nada. Pero si anulas el constructor, entonces necesitas cambiar la sugerencia de tipo del nombre y marcar el constructor con el atributo Twig\Attribute\FirstClassTwigCallableReady.

    Antes:

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);
    }
}

Después:

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);
    }
}
  • Los siguientes atributos Twig\Node\Expression\FunctionExpression están obsoletos a partir de Twig 3.12: needs_charset, needs_environment, needs_context, arguments, callable, is_variadic, y dynamic_name.
  • Los siguientes atributos Twig\Node\Expression\FilterExpression están obsoletos a partir de Twig 3.12: needs_charset, needs_environment, needs_context, arguments, callable, is_variadic, y dynamic_name.
  • Los siguientes atributos Twig\Node\Expression\TestExpression están obsoletos a partir de Twig 3.12: arguments, callable, is_variadic, y dynamic_name.
  • La clase MethodCallExpression está obsoleta a partir de Twig 3.15, usa MacroReferenceExpression en su lugar.
  • La clase Twig\Node\Expression\TempNameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\LocalVariable en su lugar.
  • La clase Twig\Node\Expression\NameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\ContextVariable en su lugar.
  • La clase Twig\Node\Expression\AssignNameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\AssignContextVariable en su lugar.
  • Las implementaciones de nodos que usan echo o print deben usar yield en su lugar; todas las implementaciones de nodos deben usar el atributo #[\Twig\Attribute\YieldReady] en su clase una vez que estén listas para yield; la opción use_yield de Environment se puede activar cuando todos los nodos usen el atributo #[\Twig\Attribute\YieldReady].
  • La clase Twig\Node\InlinePrint está obsoleta a partir de Twig 3.16 sin reemplazo.
  • La clase Twig\Node\Expression\NullCoalesceExpression está obsoleta a partir de Twig 3.17, usa Twig\Node\Expression\Binary\NullCoalesceBinary en su lugar.
  • La clase Twig\Node\Expression\ConditionalExpression está obsoleta a partir de Twig 3.17, usa Twig\Node\Expression\Ternary\ConditionalTernary en su lugar.
  • El atributo is_defined_test está obsoleto a partir de Twig 3.21, usa Twig\Node\Expression\SupportDefinedTestInterface en su lugar.
  • Instanciar Twig\Node\Node directamente está obsoleto a partir de Twig 3.15. Usa EmptyNode o Nodes en su lugar dependiendo del caso de uso. La clase Twig\Node\Node será abstracta en Twig 4.0.
  • No pasar argumentos AbstractExpression a los siguientes constructores de clase Node está obsoleto a partir de Twig 3.15:
    • AbstractBinary
    • AbstractUnary
    • BlockReferenceExpression
    • TestExpression
    • DefinedTest
    • FilterExpression
    • RawFilter
    • DefaultFilter
    • InlinePrint
    • NullCoalesceExpression

Visitantes de Nodos

  • La clase Twig\NodeVisitor\AbstractNodeVisitor está obsoleta, implementa la interfaz Twig\NodeVisitor\NodeVisitorInterface en su lugar.
  • Las opciones Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_RAW_FILTER y Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_TEXT_NODES están obsoletas a partir de Twig 3.12 y se eliminarán en Twig 4.0; ya no hacen nada.

Parser

  • Los siguientes métodos de Twig\Parser están obsoletos a partir de Twig 3.12: getBlockStack(), hasBlock(), getBlock(), hasMacro(), hasTraits(), getParent().
  • Pasar null a Twig\Parser::setParent() está obsoleto a partir de Twig 3.12.
  • El método Twig\Parser::getExpressionParser() está obsoleto a partir de Twig 3.21, usa Twig\Parser::parseExpression() en su lugar.
  • La clase Twig\ExpressionParser está obsoleta a partir de Twig 3.21:
    • parseExpression(), usa Parser::parseExpression()
    • parsePrimaryExpression(), usa Parser::parseExpression()
    • parseStringExpression(), usa Parser::parseExpression()
    • parseHashExpression(), usa Parser::parseExpression()
    • parseMappingExpression(), usa Parser::parseExpression()
    • parseArrayExpression(), usa Parser::parseExpression()
    • parseSequenceExpression(), usa Parser::parseExpression()
    • parsePostfixExpression
    • parseSubscriptExpression
    • parseFilterExpression
    • parseFilterExpressionRaw
    • parseArguments(), usa Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()
    • parseAssignmentExpression, usa AbstractTokenParser::parseAssignmentExpression
    • parseMultitargetExpression
    • parseOnlyArguments(), usa Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()

Token

  • No pasar una instancia Source al constructor Twig\TokenStream está obsoleto a partir de Twig 3.16.
  • El método Token::getType() está obsoleto a partir de Twig 3.19, usa Token::test() en su lugar.
  • La constante Token::ARROW_TYPE está obsoleta a partir de Twig 3.21, la flecha => ahora es un operador (Token::OPERATOR_TYPE).
  • Token::PUNCTUATION_TYPE con valores (, [, |, ., ?, o ?: ahora son del tipo Token::OPERATOR_TYPE.

Plantillas

  • El método Template::loadTemplate() está obsoleto.
  • Pasar instancias Twig\Template a la API pública de Twig está obsoleto (como en Environment::resolveTemplate() y Environment::load()); pasa instancias de Twig\TemplateWrapper en su lugar.

Filtros

  • El filtro spaceless está obsoleto a partir de Twig 3.12 y se eliminará en Twig 4.0.

Sandbox

  • Tener las etiquetas extends y use permitidas por defecto en un sandbox está obsoleto a partir de Twig 3.12. Necesitarás permitirlas explícitamente si es necesario en 4.0.
  • La etiqueta sandbox está obsoleta, usa la opción sandboxed de la función include en su lugar:

    Antes:

{% sandbox %}
  {% include 'user_defined.html.twig' %}
{% endsandbox %}

Después:

{{ include('user_defined.html.twig', sandboxed: true) }}

Utilidades de Testing

  • Implementar el método proveedor de datos Twig\Test\NodeTestCase::getTests() está obsoleto a partir de Twig 3.13. En su lugar, implementa el proveedor de datos estático provideTests().
  • Para hacer que su funcionalidad esté disponible para proveedores de datos estáticos, los métodos auxiliares getVariableGetter() y getAttributeGetter() en Twig\Test\NodeTestCase han quedado obsoletos. Llama a los nuevos métodos createVariableGetter() y createAttributeGetter() en su lugar.
  • El método Twig\Test\NodeTestCase::getEnvironment() se considera final a partir de Twig 3.13. Si quieres anular cómo se construye el entorno de Twig, anula createEnvironment() en su lugar.
  • El método getFixturesDir() en Twig\Test\IntegrationTestCase está obsoleto, implementa el nuevo método estático getFixturesDirectory() en su lugar, que será abstracto en 4.0.
  • Los proveedores de datos getTests() y getLegacyTests() en Twig\Test\IntegrationTestCase se consideran finales a partir de Twig 3.13.

Environment

  • El método Twig\Environment::mergeGlobals() está obsoleto a partir de Twig 3.14 y se eliminará en Twig 4.0:

    Antes:

$context = $twig->mergeGlobals($context);

Después:

$context += $twig->getGlobals();

Funciones/Filtros/Tests

  • Las opciones deprecated, deprecating_package, alternative en funciones/filtros/Tests de Twig están obsoletas a partir de Twig 3.15, y se eliminarán en Twig 4.0. Usa la opción deprecation_info en su lugar:

    Antes:

$twig->addFunction(new TwigFunction('upper', 'upper', [
    'deprecated' => '3.12', 'deprecating_package' => 'twig/twig',
]));

Después:

$twig->addFunction(new TwigFunction('upper', 'upper', [
    'deprecation_info' => new DeprecatedCallableInfo('twig/twig', '3.12'),
]));
  • Para argumentos variádicos, usa snake_case para el nombre del argumento para facilitar la transición a 4.0.
  • Pasar una string o un array a argumentos invocables de Twig que aceptan funciones flecha está obsoleto a partir de Twig 3.15; estos argumentos tendrán una sugerencia de tipo \Closure en 4.0.
  • Devolver null desde TwigFilter::getSafe() y TwigFunction::getSafe() está obsoleto a partir de Twig 3.16; devuelve [] en su lugar.

Operadores

  • Una precedencia de operador debe ser parte del rango [0, 512] a partir de Twig 3.21.
  • El operador . permite acceder a constantes de clase a partir de Twig 3.15. Esto puede ser un cambio de compatibilidad hacia atrás si no usas nombres de constantes en MAYÚSCULAS.
  • Usar ~ en una expresión con los operadores + o - sin usar paréntesis para aclarar la precedencia activa una obsolescencia a partir de Twig 3.15 (en Twig 4.0, + / - tendrán una precedencia más alta que ~).

    Por ejemplo, la siguiente expresión activará una obsolescencia en Twig 3.15:

{{ '42' ~ 1 + 41 }}

Para evitar la obsolescencia, envuelve la concatenación en paréntesis para aclarar la precedencia:

{{ ('42' ~ 1) + 41 }} {# esto es equivalente a lo que Twig 3.x hace sin los paréntesis #}

{# o #}

{{ '42' ~ (1 + 41) }} {# esto es equivalente a lo que Twig 4.x hará sin los paréntesis #}
  • Usar ?? sin paréntesis explícitos para aclarar la precedencia activa una obsolescencia a partir de Twig 3.15 (en Twig 4.0, ?? tendrá la precedencia más baja).

    Por ejemplo, la siguiente expresión activará una obsolescencia en Twig 3.15:

{{ 'notnull' ?? 'foo' ~ '_bar' }}

Para evitar la obsolescencia, envuelve la expresión ?? en paréntesis para aclarar la precedencia:

{{ ('notnull' ?? 'foo') ~ '_bar' }} {# esto es equivalente a lo que Twig 3.x hace sin los paréntesis #}

{# o #}

{{ 'notnull' ?? ('foo' ~ '_bar') }} {# esto es equivalente a lo que Twig 4.x hará sin los paréntesis #}
  • Usar el operador unario not en una expresión con operadores *, /, //, o % sin paréntesis explícitos para aclarar la precedencia activa una obsolescencia a partir de Twig 3.15 (en Twig 4.0, not tendrá una precedencia más alta que *, /, //, y %).

    Por ejemplo, la siguiente expresión activará una obsolescencia en Twig 3.15:

{{ not 1 * 2 }}

Para evitar la obsolescencia, envuelve la concatenación en paréntesis para aclarar la precedencia:

{{ (not 1 * 2) }} {# esto es equivalente a lo que Twig 3.x hace sin los paréntesis #}

{# o #}

{{ (not 1) * 2 }} {# esto es equivalente a lo que Twig 4.x hará sin los paréntesis #}
  • Usar el operador | en una expresión con + o - sin paréntesis explícitos para aclarar la precedencia activa una obsolescencia a partir de Twig 3.21 (en Twig 4.0, | tendrá una precedencia más alta que + y -).

    Por ejemplo, la siguiente expresión activará una obsolescencia en Twig 3.21:

{{ -1|abs }}

Para evitar la obsolescencia, agrega paréntesis para aclarar la precedencia:

{{ -(1|abs) }} {# esto es equivalente a lo que Twig 3.x hace sin los paréntesis #}

{# o #}

{{ (-1)|abs }} {# esto es equivalente a lo que Twig 4.x hará sin los paréntesis #}
  • El método Twig\Extension\ExtensionInterface::getOperators() está obsoleto a partir de Twig 3.21, usa Twig\Extension\ExtensionInterface::getExpressionParsers() en su lugar:

    Antes:

public function getOperators(): array {
    return [
        'not' => [
            'precedence' => 10,
            'class' => NotUnary::class,
        ],
    ];
}

Después:

public function getExpressionParsers(): array {
    return [
        new UnaryOperatorExpressionParser(NotUnary::class, 'not', 10),
    ];
}
  • La clase Twig\OperatorPrecedenceChange está obsoleta a partir de Twig 3.21, usa Twig\ExpressionParser\PrecedenceChange en su lugar.