symfony4 - form-> isValid () возвращает false, а form-> getErrors возвращает пустой массив - PullRequest
0 голосов
/ 25 сентября 2018

Я использую Symfony 4 с FOSRestBundle.У меня есть контроллер:

/**
 * @Route("/api")
 */
class ProjectController extends FOSRestController
{
    /**
     * @FOSRest\Post("/project")
     */
    public function postProjectAction(Request $request, ValidatorInterface $validator)
    {
        $project = new Project();

        $project->setCreatedBy($this->getUser()->getUser());

        $project->setCreatedAt(new \DateTime());

        $form = $this->createForm(ProjectType::class, $project);

        $form->submit($request->request->all());

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($project);
            $em->flush();
            return new JsonResponse([
                'status' => 'created'
            ], 200);
        }
        return new JsonResponse($form->getErrors(true, false), 400);
    }

}

Когда я дам дамп $ form-> isValid (), я получил false, но тело ответа []

Как я могу получить ошибку для полей?Или, может быть, я что-то не так делаю?

Существует ProjectType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class,
                [
                    'label' => 'label.name'
                ]
            )
            ->add('nameKey', TextType::class,
                [
                    'label' => 'label.nameKey'
                ]
            )
            ->add('description', TextareaType::class,
                [
                    'label' => 'label.description'
                ]
            )
            ->add('deadline', DateTimeType::class,
                [
                    'label' => 'label.deadline',
                    'widget' => 'single_text',
                    'html5' => false,
                    'attr' => [
                        'class' => 'bootstrap-datetimepicker'
                    ],
                    'format' => 'yyyy-mm-dd HH:ii'
                ]
            )
            ->add('active', ChoiceType::class,
                [
                    'label' => 'label.active',
                    'choices' => [
                        'label.yes' => true,
                        'label.no' => false
                    ]
                ]
            )
            ->add('priority', EntityType::class,
                [
                    'class' => Priority::class,
                    'choice_label' => 'name',
                    'label' => 'label.priority',
                ]
            )
            ->add('assignedUsers', EntityType::class, 
                [
                    'class' => User::class,
                    'choice_label' => 'email',
                    'label' => 'label.',
                    'multiple' => true,
                ]
            )
            ->add('assignedCustomers', EntityType::class, 
                [
                    'class' => Customer::class,
                    'choice_label' => 'email',
                    'label' => 'label.',
                ]
            )
        ;

        $builder->get('priority')->addModelTransformer($this->priorityToNumberTransformer);
        $builder->get('assignedUsers')->addModelTransformer($this->userToNumberTransformer);
        $builder->get('assignedCustomers')->addModelTransformer($this->customerToNumberTransformer);
    }

И запрашиваемые данные, которые я отправляю:

{"name": "asd", "nameKey": "AS", "description": "Simple desc", "priority": "1", "deadline": "2016-09-01 21:02:20", "active": true, "assignCustomers ": {}," assignUsers ": {}}

1 Ответ

0 голосов
/ 29 октября 2018

Вероятно, у вас проблемы с защитой от CSRF.Попробуйте создать форму и отключить защиту CSRF.Наличие защиты CSRF в API без сохранения состояния бесполезно, но включено по умолчанию.

Вы можете отключить ее при создании формы:

$form = $this->createForm(ProjectType::class, $project, [
    'csrf_protection' => false,
]);

или отключить ее через конфигурацию, определивроль пользователя:

fos_rest:
    disable_csrf_role: ROLE_API

См. https://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#csrf-validation

При возникновении ошибки проверки формы вы должны вернуть другое представление.Согласно документу https://symfony.com/doc/current/bundles/FOSRestBundle/2-the-view-layer.html#forms-and-views это может быть что-то вроде:

return new View($form, Response::HTTP_BAD_REQUEST);
...