Класс ExpressionLanguage
Класс ExpressionLanguage предоставляет движок для
вычисления строковых выражений. Он используется в
различных компонентах Symfony: в безопасности, в
маршрутизации, в DI-контейнере и в аннотациях. Первым
параметром в методы передаётся строка выражения, а
вторым - массив значений переменных, доступных внутри
выражения.
Синтаксис
<?php
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
$el = new ExpressionLanguage();
$res = $el->evaluate($expression, $values);
?>
Пример
Давайте вычислим простое арифметическое выражение:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$el = new ExpressionLanguage();
return new Response((string) $el->evaluate('1 + 2 * 3'));
}
}
?>
Результат выполнения кода:
7
Пример
Давайте передадим переменные в выражение через второй параметр:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$el = new ExpressionLanguage();
$res = $el->evaluate(
'user == "abcde" and count > 3',
['user' => 'abcde', 'count' => 5]
);
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
true
Пример
Давайте используем объект внутри выражения и обратимся к его свойству:
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
use Symfony\Component\HttpFoundation\Response;
class ArticleController extends AbstractController
{
public function index(): Response
{
$el = new ExpressionLanguage();
$article = new \stdClass();
$article->title = 'hello';
$article->published = true;
$res = $el->evaluate(
'article.published ? article.title : "draft"',
['article' => $article]
);
return new Response($res);
}
}
?>
Результат выполнения кода:
"hello"