Правило Expression
Правило Expression относится к секции form и
вешается на поле формы. Оно проверяет значение поля
с помощью выражения на языке ExpressionLanguage. Первым
параметром передаётся строка выражения, в которой
доступна переменная value - текущее значение поля.
Вторым параметром можно передать массив values
с дополнительными переменными для выражения.
Синтаксис
#[Expression(expression: 'expression', values: [])]
Пример
Давайте создадим форму с полем text и повесим
на него правило Expression, требующее, чтобы
значение было длиннее трёх символов:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Expression;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('text', TextType::class, [
'constraints' => [
new Expression(
'value.length > 3',
),
],
]);
}
}
?>
При отправке значения 'abcde' форма будет валидной,
а при значении 'abc' - нет.
Пример
Давайте передадим дополнительную переменную через
параметр values и сравним значение поля с ней:
<?php
namespace App\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\Expression;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('text', TextType::class, [
'constraints' => [
new Expression(
'value == expected',
['expected' => 'abcde'],
),
],
]);
}
}
?>
При отправке значения 'abcde' форма будет валидной,
при любом другом значении - нет.
Пример
Давайте обработаем форму в контроллере и выведем результат валидации:
<?php
namespace App\Controller;
use App\Form\ArticleType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article', name: 'article_form')]
public function form(Request $request): Response
{
$form = $this->createForm(ArticleType::class);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
return new Response('valid');
}
return new Response('invalid');
}
}
?>
Результат выполнения кода при значении 'abcde':
valid
Результат выполнения кода при значении 'abc':
invalid