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).
twig_test_iterable está obsoleta; usa la función nativa de PHP is_iterable en su lugar.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.
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();
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);
}
}
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.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.Twig\Node\Expression\TestExpression están obsoletos a partir de Twig 3.12: arguments, callable, is_variadic, y dynamic_name.MethodCallExpression está obsoleta a partir de Twig 3.15, usa MacroReferenceExpression en su lugar.Twig\Node\Expression\TempNameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\LocalVariable en su lugar.Twig\Node\Expression\NameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\ContextVariable en su lugar.Twig\Node\Expression\AssignNameExpression está obsoleta a partir de Twig 3.15; usa Twig\Node\Expression\Variable\AssignContextVariable en su lugar.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\InlinePrintestá obsoleta a partir de Twig 3.16 sin reemplazo.- La clase
Twig\Node\Expression\NullCoalesceExpressionestá obsoleta a partir de Twig 3.17, usaTwig\Node\Expression\Binary\NullCoalesceBinaryen su lugar.- La clase
Twig\Node\Expression\ConditionalExpressionestá obsoleta a partir de Twig 3.17, usaTwig\Node\Expression\Ternary\ConditionalTernaryen su lugar.- El atributo
is_defined_testestá obsoleto a partir de Twig 3.21, usaTwig\Node\Expression\SupportDefinedTestInterfaceen su lugar.
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.AbstractExpression a los siguientes constructores de clase Node está obsoleto a partir de Twig 3.15:
AbstractBinaryAbstractUnaryBlockReferenceExpressionTestExpressionDefinedTestFilterExpressionRawFilterDefaultFilterInlinePrintNullCoalesceExpressionTwig\NodeVisitor\AbstractNodeVisitor está obsoleta, implementa la interfaz Twig\NodeVisitor\NodeVisitorInterface en su lugar.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.Twig\Parser están obsoletos a partir de Twig 3.12: getBlockStack(), hasBlock(), getBlock(), hasMacro(), hasTraits(), getParent().null a Twig\Parser::setParent() está obsoleto a partir de Twig 3.12.Twig\Parser::getExpressionParser() está obsoleto a partir de Twig 3.21, usa Twig\Parser::parseExpression() en su lugar.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()parsePostfixExpressionparseSubscriptExpressionparseFilterExpressionparseFilterExpressionRawparseArguments(), usa Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()parseAssignmentExpression, usa AbstractTokenParser::parseAssignmentExpressionparseMultitargetExpressionparseOnlyArguments(), usa Twig\ExpressionParser\Infix\ArgumentsTrait::parseNamedArguments()Source al constructor Twig\TokenStream está obsoleto a partir de Twig 3.16.Token::getType() está obsoleto a partir de Twig 3.19, usa Token::test() en su lugar.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.Template::loadTemplate() está obsoleto.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.spaceless está obsoleto a partir de Twig 3.12 y se eliminará en Twig 4.0.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) }}
Twig\Test\NodeTestCase::getTests() está obsoleto a partir de Twig 3.13. En su lugar, implementa el proveedor de datos estático provideTests().getVariableGetter() y getAttributeGetter() en Twig\Test\NodeTestCase han quedado obsoletos. Llama a los nuevos métodos createVariableGetter() y createAttributeGetter() en su lugar.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.getFixturesDir() en Twig\Test\IntegrationTestCase está obsoleto, implementa el nuevo método estático getFixturesDirectory() en su lugar, que será abstracto en 4.0.getTests() y getLegacyTests() en Twig\Test\IntegrationTestCase se consideran finales a partir de Twig 3.13.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();
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'),
]));
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.null desde TwigFilter::getSafe() y TwigFunction::getSafe() está obsoleto a partir de Twig 3.16; devuelve [] en su lugar.. 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),
];
}
Twig\OperatorPrecedenceChange está obsoleta a partir de Twig 3.21, usa Twig\ExpressionParser\PrecedenceChange en su lugar.