Правило Choice
Правило Choice вешается на поле формы и проверяет,
что переданное значение входит в заданный список вариантов.
Первым параметром передаётся массив допустимых значений.
Вторым параметром можно указать настройки: message для
текста ошибки, multiple для разрешения нескольких
значений, min и max для ограничения количества
выбранных элементов. Если значение не входит в список,
форма считается невалидной.
Синтаксис
Choice(choices, options)
Пример
Давайте создадим форму с полем color и навесим
на него правило Choice со списком допустимых значений:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentValidatorConstraintsChoice;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('color', ChoiceType::class, [
'choices' => [
'Red' => 'red',
'Green' => 'green',
'Blue' => 'blue',
],
'constraints' => [
new Choice([
'choices' => ['red', 'green', 'blue'],
'message' => 'Choose a valid color.',
]),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Теперь обработаем отправку формы в контроллере:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
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()) {
$res = $form->getData();
return new Response('color: ' . $res['color']);
}
return $this->render('article/form.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода для значения 'red':
"color: red"
Пример
Давайте разрешим выбирать несколько значений сразу
с помощью опции multiple и ограничим их количество
опциями min и max:
<?php
namespace AppForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentFormExtensionCoreTypeChoiceType;
use SymfonyComponentValidatorConstraintsChoice;
use SymfonyComponentOptionsResolverOptionsResolver;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->add('tags', ChoiceType::class, [
'choices' => [
'One' => 'one',
'Two' => 'two',
'Three' => 'three',
'Four' => 'four',
],
'multiple' => true,
'constraints' => [
new Choice([
'choices' => ['one', 'two', 'three', 'four'],
'multiple' => true,
'min' => 1,
'max' => 2,
'minMessage' => 'Choose at least {{ limit }} tag.',
'maxMessage' => 'Choose at most {{ limit }} tags.',
]),
],
]);
}
public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
?>
Теперь обработаем отправку формы в контроллере:
<?php
namespace AppController;
use AppFormArticleType;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
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()) {
$res = $form->getData();
return new Response(implode(', ', $res['tags']));
}
return $this->render('article/form.html.twig', [
'form' => $form->createView(),
]);
}
}
?>
Результат выполнения кода для значений ['one', 'three']:
"one, three"
Смотрите также
-
класс
Form,
который представляет форму в Symfony -
метод
isValid,
который проверяет валидность формы -
правило
Choice,
которое проверяет значение по списку вариантов -
тип
ChoiceType,
который создаёт поле выбора в форме