Синтаксис виразів

Дата оновлення перекладу 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' : '')

Інші оператори

Вбудовані обʼєкти та змінні

При використанні цього компонента у додатку Symfony, певні об'єкти та змінні автоматично впроваджуються Symfony, щоб ви могли використовувати їх у своїх виразах (наприклад, запит, поточний користувач тощо):