Компонент ExpressionLanguage

Компонент ExpressionLanguage

Компонент ExpressionLanguage надає двигун, який може скомпілювати та оцінити вирази. Вирази - це один рядок, який повертає значення (в основному, але не тільки, булеве).

Установка

1
$ composer require symfony/expression-language

Також ви можете колнувати репозиторій https://github.com/symfony/expression-language.

Note

Якщо ви встановлюєте цей компонент поза додатком Symfony, вам потрібно підключити файл vendor/autoload.phpу вашому коді для включення механізму автозавантаження класів, наданих Composer. Детальніше можна прочитати у цій статті.

Як може двигун виразів допомогти мені?

Ціль цього компонента - дозволити користувачам використовувати вираз всередині конфігурації для складнішої логіки. Наприклад, фреймворк Symfony використовує вирази у безпеці для валідації правил, і у співставленні маршрутів.

Окрім використання компонента у самому фреймворку, компонент ExpressionLanguage також є ідеальним кандидатом для заснування двигуну бізнес-правила. Ідея полягає в тому, щоб дозвлити веб-розробнику сайту сконфігурувати все динасічно, не використовуючи PHP та не викликаючи проблем безпеки:

1
2
3
4
5
6
7
8
# Отримати спеціальну ціну, якщо
user.getGroup() in ['good_customers', 'collaborator']

# Просунути статтю на головну сторінку, коли
article.commentCount > 100 and article.category not in ["misc"]

# Відправити сповіщення, коли
product.stock  15

Вирази можна розглядати як дуже захищену пісочницю PHP, і вони мають імунтітет до зовнішніх впроваджень, так як ви повинні чітко оголосити, які змінні доступні у виразі.

Використання

Компонент ExpressionLanguage може компілювати та оцінювати вирази. Вирази - це один рядок, який часто повертає булеве значення, яке може бути використано кодом, виконуючи вираз у твердженні if. Простим прикладом виразу буде 1 + 2. Ви також можете використовувати складніші вирази, на кшталт someArray[3].someMethod('bar').

Компонент надає 2 способи роботи з виразами:

  • оценка: вираз оцінюється без компіляції в PHP;
  • компиляция: вираз компілюється в PHP, щоб мати можливість кешування та оцінювання.

Головний клас компонента - ExpressionLanguage:

1
2
3
4
5
6
7
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$expressionLanguage = new ExpressionLanguage();

var_dump($expressionLanguage->evaluate('1 + 2')); // displays 3

var_dump($expressionLanguage->compile('1 + 2')); // displays (1 + 2)

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

Див. , щоб вивчити синтаксис виразів компонента ExpressionLanguage.

Передача у змінних

Ви також можете передати змінні у вираз, які можуть бути будь-яким валідним PHP-типом (включно з обʼєктами):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;

$expressionLanguage = new ExpressionLanguage();

class Apple
{
    public $variety;
}

$apple = new Apple();
$apple->variety = 'Honeycrisp';

var_dump($expressionLanguage->evaluate(
    'fruit.variety',
    [
        'fruit' => $apple,
    ]
)); // displays "Honeycrisp"

Щоб дізнатися більше, дивіться запис , особливо Робота з обʼєктами та Робота з масивами.

Caution

При використанні змінних у виразах, уникайте передачі недовірених даних у масив змінних. Якщо ви не можете цього уникнути, очищуйте не буквенно-цифрові символи в недовірених даних, щоб запобігти впроовадженню символів контролю та зміні виразу зловмисними користувачами.

Кешування

Компонент надає декілька різних стратегій кешування, прочитайте більше про них у .

Скидання та редагування ДАС

ДАС (Дерево абстрактного синтаксису) виразів може бути скинутим та обробленим, як пояснюється у .