Новое в Symfony 7.2: Улучшения языка выражений
Компонент ExpressionLanguage предоставляет механизм, позволяющий компилировать и оценивать выражения. Основное назначение компонента — позволить пользователям использовать выражения внутри конфигурации для более сложной логики. В Symfony 7.2 мы улучшили его, добавив новые возможности.
Новые операторы ExpressionLanguage
- Pull Request: [ExpressionLanguage] Add support for
<<
,>>
, and~
bitwise operators #58052 Alexandre Daubois - Pull Request: [ExpressionLanguage] Add support for logical
xor
operator #58341 HypeMC
Компонент 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;