Синтаксис виразів
Дата оновлення перекладу 2024-05-29
Синтаксис виразів
Компонент 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
)
Caution
Зворотний слеш (\
) повинен бути екранований 4-ма зворотними слешами (
) у рядку
і 8 зворотними слешами (
) в регулярному виразі:
1 2
echo $expressionLanguage->evaluate('"\\\\"'); // виводить \
$expressionLanguage->evaluate('"a\\\\b" відповідає "/^a\\\\\\\\b$/"'); // повертає true
Контрольні символи (наприклад, \n
) у виразах замінюються пробілами.
Щоб уникнути цього, екрануйте послідовність одним зворотним слешем
(наприклад, \\n
).
Робота з обʼєктами
При передачі об'єктів у вираз можна використовувати різні синтаксиси для доступу до властивостей та виклику методів об'єкта.
Доступ до публічних властивостей
Доступ до публічних властивостей об'єктів можна отримати за допомогою синтаксису .
,
подібно до JavaScript:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
class Apple
{
public string $variety;
}
$apple = new Apple();
$apple->variety = 'Honeycrisp';
var_dump($expressionLanguage->evaluate(
'fruit.variety',
[
'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(int $times): string
{
$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' => '...'])
Оператор коалесценції Null
Повертає ліву частину, якщо вона існує і не дорівнює null
; інакше
повертає праву частину. Вирази можуть об'єднувати декілька операторів коалесценції
у ланцюжок:
foo ?? 'no'
foo.baz ?? 'no'
foo[3] ?? 'no'
foo.baz ?? foo['baz'] ?? 'no'
Note
Основна відмінність від оператора null-коалесценції в PHP полягає в тому, що ExpressionLanguage згенерує виключення при спробі отримати доступ до неіснуючої змінної.
Робота з функціями
Ви також можете використовувати зареєстровані функції у виразі, використовуючи той самий синтаксис, що і у PHP та JavaScript. Компонент ExpressionLanguage постачається з наступними функціями за замовчуванням:
constant()
enum()
min()
max()
Функція constant()
Ця функція поверне значення константи PHP:
1 2 3 4 5
define('DB_USER', 'root');
var_dump($expressionLanguage->evaluate(
'constant("DB_USER")'
));
Це виведе root
.
Це також працює з константами класу:
1 2 3 4 5 6 7 8 9 10
namespace App\SomeNamespace;
class Foo
{
public const API_ENDPOINT = '/api';
}
var_dump($expressionLanguage->evaluate(
'constant("App\\\SomeNamespace\\\Foo::API_ENDPOINT")'
));
Це виведе /api
.
Функція enum()
Ця функція поверне випадок зчислення:
1 2 3 4 5 6 7 8 9 10
namespace App\SomeNamespace;
enum Foo
{
case Bar;
}
var_dump(App\Enum\Foo::Bar === $expressionLanguage->evaluate(
'enum("App\\\SomeNamespace\\\Foo::Bar")'
));
Це виведе true
.
Функція min()
Ця функція поверне найменше значення з заданих параметрів. Ви можете передавати різні типи параметрів (наприклад, дати, рядки, числові значення) і навіть змішувати їх (наприклад, передавати числові значення і рядки). Внутрішньо він використовує PHP-функцію :phpfunction:`min' для пошуку найменшого значення:
1 2 3
var_dump($expressionLanguage->evaluate(
'min(1, 2, 3)'
));
Це виведе 1
.
Функція max()
Ця функція поверне найбільше значення з заданих параметрів. Ви можете передавати різні типи параметрів (наприклад, дати, рядки, числові значення) і навіть змішувати їх (наприклад, передавати числові значення і рядки). Внутрішньо він використовує PHP-функцію max для пошуку найбільшого значення:
1 2 3
var_dump($expressionLanguage->evaluate(
'max(1, 2, 3)'
));
Це виведе 3
.
7.1
Функції min()
та max()
були представлені в Symfony 7.1.
Tip
Щоб дізнатися, як зареєструвати власні функції для використання у виразі, дивіться "".
Робота з масивами
Якщо ви передаєте масив у вираз, використовуйте синтаксис []
для доступу до
до ключів масиву, подібно до 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
.
Бітові оператори
&
(та)|
(або)^
(xor)
Оператори порівняння
==
(дорівнює)===
(ідентично)!=
(не дорівнює)!==
(не ідентично)<
(менше, ніж)>
(більше, ніж)<=
(менше або дорівнює)>=
(більше або дорівнює)matches
(співпадіння з регулярним виразом)contains
starts with
ends with
Tip
Щоб протестувати, що рядок не відповідає регулярному виразу, використовуйте логічний
оператор not
у поєднанні з оператором matches
:
1
$expressionLanguage->evaluate('not ("foo" matches "/bar/")'); // повертає 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 string $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 int $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 )??
(оператор null-коалесценції)
Вбудовані обʼєкти та змінні
При використанні цього компонента у додатку Symfony, певні об'єкти та змінні автоматично впроваджуються Symfony, щоб ви могли використовувати їх у своїх виразах (наприклад, запит, поточний користувач тощо):
- Змінні, доступні у виразах безпеки;
- Змінні, доступні у виразах сервіс-контейнера;
- Змінні, доступні у виразах маршрутизації .