Новое в Symfony 7.2: Улучшения языка выражений

Источник: «New in Symfony 7.2: Expression Language Improvements»
В Symfony 7.2 улучшен компонент ExpressionLanguage, добавлены новые битовые и логические операторы, упрощена регистрация кастомных провайдеров и реализована поддержка комментариев.

Компонент ExpressionLanguage предоставляет механизм, позволяющий компилировать и оценивать выражения. Основное назначение компонента — позволить пользователям использовать выражения внутри конфигурации для более сложной логики. В Symfony 7.2 мы улучшили его, добавив новые возможности.

Новые операторы ExpressionLanguage

Компонент ExpressionLanguage уже поддерживает некоторые бинарные операторы: & (and), | (or) и ^ (xor). В Symfony 7.2 мы добавляем поддержку остальных побитовых операторов: << (сдвиг влево), >> (сдвиг вправо) и ~ (not).

Эти операторы не самые популярные, но они могут пригодиться в таких сценариях, как работа с битовыми полями внутри выражений, например, с флагами компонента Yaml:

use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$el = new ExpressionLanguage();

$el->evaluate('1 << 4'); // результат: 16
$el->evaluate('32 >> 4'); // результат: 2
$el->evaluate('~5'); // результат: -6

Кроме того, мы добавляем поддержку ^ (xor) в качестве логического оператора (этот оператор уже был доступен в качестве бинарного оператора):

$el->evaluate('$a xor $b');  // истинно, если истинно либо $a, либо $b, но не оба.

Кастомные провайдеры итераций

Компонент ExpressionLanguage позволяет расширить его возможности новыми функциями благодаря кастомным провайдерам выражений. Можно передавать свои провайдеры через второй аргумент конструктора сервиса ExpressionLanguage.

Этот аргумент представлял собой массив PHP, поэтому нельзя было использовать итерируемые переменные (например, итератор с тегами). В Symfony 7.2 мы преобразовали этот array аргумент в iterable аргумент, поэтому его можно использовать следующим образом:

app.my_expression_language:
class: Symfony\Component\ExpressionLanguage\ExpressionLanguage
arguments:
$providers: !tagged_iterator app.my_custom_tag

Добавлена поддержка комментариев

Хорошие языки конфигурации поддерживают комментарии. Поэтому, начиная с Symfony 7.2, в компонент ExpressionLanguage будет добавлена поддержка однострочных или многострочных комментариев с синтаксисом: /* это комментарий */. Это будет удобно, для объяснения некоторых магических значений (например, используемых в тестах):

// До
$expression = 'customer.group == 'vip_customers' or customer.id == 123';

// После
$expression = <<<EXPRESSION
customer.group == 'vip_customers'
or customer.id == 123 /* 123 is an internal test customer */
EXPRESSION;

Комментарии


Дополнительные материалы

Предыдущая Статья

Напоминание, что @scope и блоки стилей HTML — это мощное сочетание

Следующая Статья

Как деструктуризация массивов может замедлить JavaScript код