@MikUrrey

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

Приветствую!
Есть сущность
class Meeting
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    //......и т. д.
}

и форма
class MeetingType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title', TextType::class)
            ->add('desctiption', TextareaType::class)
            ->add('avatar', FileType::class)
            ->add('beginAt', IntegerType::class)
            ->add('createdAt', IntegerType::class)
            ->add('updatedAt', IntegerType::class)
            ->add('uid', IntegerType::class)
            ;
    }
}

Данные отправляются XHR'ом, поэтому в контроллере все вот так:
public function createAction(Request $request)
{
    $data = $request->request->all();
    $formData = [
       //... здесь заполнение в соответствии с моделью и преобразование некоторых полей
       //... так же подцепляется CSRF токен
    ];
    $form = $this->createForm(MeetingType::class, new Meeting);
    $form->submit($formData);
    if (!$form->isValid()) {
        $errors = [];
               foreach ($form->getErrors(true, false) as $key => $error) {
                    if (method_exists($error, 'getMessage')) {
                        $errors[] = $error->getMessage();
                    } else {
                        foreach ($error as $k => $e) {
                            $errors[] = $e->getMessage();
                        }
                    }
                }
                return new JsonResponse([
                    'success' => false,
                    'errors' => $errors,
                    'type' => 'form-validation',
                ]);
    }
}

Проблемы следующие:
а) Если getErrors(false), то форма !isValid, но список ошибок пустой. Т. е. в плоский список почему-то ошибки не преобразуются.
б) Если я добавляю constraints в сущность с помощью loadValidatorMetadata, либо в качестве параметров полей в MeetingType, это не работает.
в) Откуда-то взялись две ошибки Значение не должно быть пустым, хотя constraints не прописаны.
г) Никак не получается ассоциировать ошибки с определенными полями.
д) Почему-то $error->getCause() вызывает зверский жор памяти и мертвое зависание всего сервера насовсем.

Очевидно, здесь есть много чего, что я не понимаю и делаю неправильно. Как все-таки организовать правильную валидацию полей на стороне сервера?
  • Вопрос задан
  • 98 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
В вашем случае "правильно" - это не использовать формы. symfony/serializer + symfony/validator + symfony/security-csrf
https://qna.habr.com/q/548586#answer_1249224

+ Надо использовать DependencyInjection: https://symfony.com/doc/current/service_container.html
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы