Компонент 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
При використанні змінних у виразах, уникайте передачі недовірених даних у масив змінних. Якщо ви не можете цього уникнути, очищуйте не буквенно-цифрові символи в недовірених даних, щоб запобігти впроовадженню символів контролю та зміні виразу зловмисними користувачами.
Кешування
Компонент надає декілька різних стратегій кешування, прочитайте більше про них у .
Скидання та редагування ДАС
ДАС (Дерево абстрактного синтаксису) виразів може бути скинутим та обробленим, як пояснюється у .