SYmfony 3.4: как правильно сделать валидацию формы?

В Symfony 3.4 для выполнения валидации формы можно использовать компонент валидации Symfony Validator.

Первым шагом следует убедиться, что компонент Symfony Validator установлен в вашем проекте. Если компонент не установлен, выполните команду composer require symfony/validator, чтобы добавить его в зависимости.

После установки компонента Symfony Validator создайте класс формы, наследующийся от SymfonyComponentFormAbstractType. Добавьте необходимые поля для формы и определите метод buildForm, где вы можете настроить каждое поле формы и добавить валидаторы.

Например, у нас есть форма с одним полем email, которое должно быть обязательным и соответствовать формату электронной почты. Для этого добавим валидацию в классе формы:

use SymfonyComponentFormAbstractType;
use SymfonyComponentFormExtensionCoreTypeEmailType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolver;
use SymfonyComponentValidatorConstraintsEmail;
use SymfonyComponentValidatorConstraintsNotBlank;

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email', EmailType::class, [
                'constraints' => [
                    new NotBlank(),
                    new Email(),
                ],
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundleEntityMyEntity',
        ]);
    }
}

Здесь мы использовали два валидатора: NotBlank и Email из компонента Symfony Validator. NotBlank проверяет, что поле не пустое, а Email проверяет, что значение поля соответствует формату электронной почты.

После создания класса формы вы можете использовать его в вашем контроллере для обработки запросов и выполнения валидации:

use AppBundleEntityMyEntity;
use AppBundleFormMyFormType;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;

class MyController extends Controller
{
    public function myAction(Request $request)
    {
        $myEntity = new MyEntity();
        $form = $this->createForm(MyFormType::class, $myEntity);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            // Обработка формы при успешной валидации
        }

        // Вывод формы в представлении
        return $this->render('my_template.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

В вашем представлении (my_template.html.twig) вы можете отобразить форму с помощью функции form_widget:

{{ form_start(form) }}
    {{ form_widget(form.email) }}
    {{ form_errors(form.email) }}
    {{ form_rest(form) }}
    <button type="submit">Submit</button>
{{ form_end(form) }}

Здесь мы используем функции form_start, form_widget, form_errors, form_rest для отображения формы и сообщений об ошибках.