Синтаксис выражения
Дата обновления перевода 2023-01-20
Синтаксис выражения
Компонент ExpressionLanguage использует особенный синтаксис, который основывается на синтаксисе выражений Twig. В этом документе вы можете найти все поддерживаемые синтаксисы.
Поддерживаемые литералы
Компонент поддерживает:
- строки - одинарные и двойные кавычки (например,
'hello'
) - числа - целые числа (например,
103
), десятичные дроби (например,9.95
), десятичные дроби без ведущего ноля (например,.99
- эквивалентно0.99
); все числа поддерживают опциональные нижние подчёркивания в качестве разделителей для улучшения читаемости (например,1_000_000
,3.14159_26535
) - массивы - используя JSON-подобные нотации (например,
[1, 2]
) - хеши - используя JSON-подобные нотации (например,
{ foo: 'bar' }
) - булевы значения -
true
иfalse
- пустое значение -
null
- экспоненциальное значение - также известное как научное (например,
1.99E+3
или1e-2
)
6.1
Поддержка десятичных дробей без ведущего ноля и разделителей нижнего подчёркивания были представлены в Symfony 6.1.
Caution
Обратный слеш (\
) должен быть экранирован 4 обратными слешами (
) в строке,
и 8 обратными слешами (
) в регулярном выражении:
1 2
echo $expressionLanguage->evaluate('"\\\\"'); // prints \
$expressionLanguage->evaluate('"a\\\\b" matches "/^a\\\\\\\\b$/"'); // returns true
Управляющие символы (например, \n
) в выражениях заменяются пробелом.
Для того, чтобы избежать этого, экранируйте последовательность одним обратным
слешем (например, \\n
).
Работа с объектами
При передаче объектов в выражение, вы можете использовать разные синтаксисы для доступа к свойствам и вызова методов в объекте.
Доступ к публичным свойствам
Публичные свойства объектов могут быть доступны через синтаксис .
, схожий с
JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class Apple
{
public $variety;
}
$apple = new Apple();
$apple->variety = 'Honeycrisp';
var_dump($expressionLanguage->evaluate(
'fruit.variety',
array(
'fruit' => $apple,
)
));
Это выведет Honeycrisp
.
Вызов методов
Синтаксис .
также может быть использован для вызова методов объекта,
схоже с JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
class Robot
{
public function sayHi($times)
{
$greetings = [];
for ($i = 0; $i < $times; $i++) {
$greetings[] = 'Hi';
}
return implode(' ', $greetings).'!';
}
}
$robot = new Robot();
var_dump($expressionLanguage->evaluate(
'robot.sayHi(3)',
[
'robot' => $robot,
]
));
Это выведет Hi Hi Hi!
.
Оператор защиты от Null
Используйте синтаксис ?.
, чтобы получить доступ к свойствам и методам объектов,
которые могут быть null
(это эквивалентно PHP-оператору защиты от null
$object?->propertyOrMethod
):
1 2 3 4 5 6 7
// это вызовет исключение, если `fruit` - `null`
$expressionLanguage->evaluate('fruit.color', ['fruit' => '...'])
$expressionLanguage->evaluate('fruit.getStock()', ['fruit' => '...'])
// это вернёт `null`, если `fruit` - `null`
$expressionLanguage->evaluate('fruit?.color', ['fruit' => '...'])
$expressionLanguage->evaluate('fruit?.getStock()', ['fruit' => '...'])
6.1
Оператор защиты от null был представлен в Symfony 6.1.
Работа с функциями
Вы также можете использовать зарегистрированные функции в выражении, используя
тот же синтаксис, что в PHP и JavaScript. Компонент ExpressionLanguage поставляется
с одной функцией по умолчанию: constant()
, которая вернёт значение PHP константы:
1 2 3 4 5
define('DB_USER', 'root');
var_dump($expressionLanguage->evaluate(
'constant("DB_USER")'
));
Это выведет root
.
Tip
Чтобы прочитать о том, как зарегистрировать ваши собственные функции для использования в выражении, см. "Расширение ExpressionLanguage".
Работа с массивами
Если вы передаёте массив в выражение, используйте синтаксис []
для доступа к
ключам массива, схоже с JavaScript:
1 2 3 4 5 6 7 8
$data = ['life' => 10, 'universe' => 10, 'everything' => 22];
var_dump($expressionLanguage->evaluate(
'data["life"] + data["universe"] + data["everything"]',
[
'data' => $data,
]
));
Это выведет 42
.
Поддерживаемые операторы
Компонент поставляется со множеством операторов:
Арифметические операторы
+
(сложение)-
(вычитание)*
(умножение)/
(деление)%
(модуль)**
(pow)
К примеру:
1 2 3 4 5 6 7 8
var_dump($expressionLanguage->evaluate(
'life + universe + everything',
[
'life' => 10,
'universe' => 10,
'everything' => 22,
]
));
Это выведет 42
.
Побитовые операторы
&
(и)|
(или)^
(исключающее или)
Сравнительные операторы
==
(равно)===
(идентично)!=
(не равно)!==
(не идентично)<
(меньше чем)>
(больше чем)<=
(меньше или равно)>=
(больше или равн)matches
(совпадение регулярных выражений)contains
starts with
ends with
6.1
Операторы contains
, starts with
и ends with
были представлены в
Symfony 6.1.
Tip
Чтобы протестировать, что строка не совпадает с регулярным варажением,
используйте логический оператор not
в сочетании с оператором matches
:
1
$expressionLanguage->evaluate('not ("foo" matches "/bar/")'); // returns true
Вы должны использовать скобки, так как одинарный оператор not
имеет
преимущество над бинарный оператором matches
.
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
$ret1 = $expressionLanguage->evaluate(
'life == everything',
[
'life' => 10,
'everything' => 22,
]
);
$ret2 = $expressionLanguage->evaluate(
'life > everything',
[
'life' => 10,
'everything' => 22,
]
);
Обе переменные будут установлены, как false
.
Логические операторы
not
или!
and
или&&
or
или||
Например:
1 2 3 4 5 6 7 8
$ret = $expressionLanguage->evaluate(
'life < universe or life < everything',
[
'life' => 10,
'universe' => 10,
'everything' => 22,
]
);
Эта переменная $ret
будет установлена, как true
.
Операторы строк
~
(соединение)
Например:
1 2 3 4 5 6 7
var_dump($expressionLanguage->evaluate(
'firstName~" "~lastName',
[
'firstName' => 'Arthur',
'lastName' => 'Dent',
]
));
Это выведет Arthur Dent
.
Операторы массива
in
(содержит)not in
(не содержит)
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class User
{
public $group;
}
$user = new User();
$user->group = 'human_resources';
$inGroup = $expressionLanguage->evaluate(
'user.group in ["human_resources", "marketing"]',
[
'user' => $user,
]
);
$inGroup
будет оцениваться, как true
.
Операторы чисел
..
(диапазон)
Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class User
{
public $age;
}
$user = new User();
$user->age = 34;
$expressionLanguage->evaluate(
'user.age in 18..45',
[
'user' => $user,
]
);
Это будет оценено, как true
, потому что user.age
находится в диапазоне от
18
до 45
.
Троичные операторы
foo ? 'yes' : 'no'
foo ?: 'no'
(равноfoo ? foo : 'no'
)foo ? 'yes'
(равноfoo ? 'yes' : ''
)
Оператор коалесценции null
Это то же самое, что и PHP оператор коалесценции null, который объединяет троичный
оператор и isset()
. Он возвращает левую сторону, если он существует и не является
null
; иначе он возвращает правую сторону. Отметьте, что вы можете создать цепочку
из нескольких операторов коалесценции.
foo ?? 'no'
foo.baz ?? 'no'
foo[3] ?? 'no'
foo.baz ?? foo['baz'] ?? 'no'
6.2
Оператор коалесценции null был представлен в Symfony 6.2.
Встроенные объекты и переменные
При использовании этого компонента внутри приложения Symfony, определенные объекты и переменны автоматически внедряются Symfony, чтобы вы могли использовать их в своих выражениях (например, в запросе, текущем пользователе и т.д.):
- Переменные, доступные в выражениях безопасности;
- Переменные, доступные в выражениях контейнера;
- Переменные, доступные в выражениях маршрутизации .