Новое в 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
xoroperator #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;