Компонент 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',
    array(
        'fruit' => $apple,
    )
));

Это отобразит "Honeycrisp". Чтобы узнать больше, см. запись , особенно The Expression Syntax и The Expression Syntax.

Кеширование

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

Сброс и редактирование ДАС

ДАС (Дерево абстрактного синтаксиса) выражений может быть сброшено и обработано, как объясняется в .