Компонент ExpressionLanguage

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

Установка

1
$ composer require symfony/expression-language

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

Note

If you install this component outside of a Symfony application, you must require the vendor/autoload.php file in your code to enable the class autoloading mechanism provided by Composer. Read this article for more details.

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

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

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

См. 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;

$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, особенно Работа с объектами и Работа с массивами.

Кеширование

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

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

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

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