Компонент ExpressionLanguage

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

Установка

Вы можете установить компонент 2 разными способами:

Как может двигатель выражений помочь мне?

Целью этого компонента является позволить пользователям использовать выражения внутри конфигурации для более сложной логики. Например, фреймворк 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;

$language = new ExpressionLanguage();

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

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

Синтаксис выражений

См. The Expression Syntax, чтобы изучить синтаксис выражений компонента 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;

$language = new ExpressionLanguage();

class Apple
{
    public $variety;
}

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

var_dump($language->evaluate(
    'fruit.variety',
    array(
        'fruit' => $apple,
    )
));

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

Кеширование

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

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

ДАС (Дерево абстрактного синтаксиса) выражений может быть сброшено и обработано, как объясняется в Dumping and Manipulating the AST of Expressions.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.