Как отправить форму с помощью Vue Axios в Symfony 4? - PullRequest
0 голосов
/ 23 сентября 2019

как я могу отправить данные из приложения vue в Symfony по Axios?Когда я пытаюсь отправить данные, запрос Symfony их не видит.

Код контроллера:

    $form = $this->createForm(TeacherType::class);
    $form->submit($request->request->all());
    $form->handleRequest($request);


    if($form->isSubmitted() && !$form->isValid()) {
        return new JsonResponse([
            'code' => "400",
            'data' => $this->getErrorMessages($form),
        ]);
    }

    return new JsonResponse(array(
        'code' => 200,
    ));

axios:

      sent() {
    axios.post('http://localhost:8000/valid', {
         firstname: this.firstname
      })
      .then(function (response) {
        console.log(response);
      })
      .catch(function (error) {
        console.log(error);
      });
  }

Форма:

 <form @submit.prevent="sent" id="form" name="teacher" method="POST"  action="#">
        <input type="text" name="teacher[firstname]" v-model="firstname">
        <button type="submit">OK</button>
    </form>

Всегда мой ответ: {'code': 400} и предупреждение о том, что имя не должно быть пустым (в форме установлено assert NotBlank для имени)

Что я могу сделать?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Это происходит потому, что ваши поля в HTML-документе имеют неправильные имена.

В настоящее время:

teacher[firstname]

, а скорее должно быть (более или менее):

teacher_teacher[firstname]

Используйте вместо этого FormFactoryInterface для создания именованной формы:

public function yourAction(Request $request, FormFactoryInterface $forms)
{
    $form = $this->forms->createNamed('', TeacherType::class);
    $form->handleRequest($request);

    if ($form->isSubmitted() && !$form->isValid()) {
        return new JsonResponse([
            'code' => '400',
            'data' => $this->getErrorMessages($form),
        ]);
    }

    return new JsonResponse(['code' => 200]);
}

Когда вы создаете форму без имени (например, $this->createForm(TeacherType::class))для вас автоматически генерируется имя: имя формы без слов Form и Type в конце, поэтому необходимо иметь часть teacher_ перед именем поля.

0 голосов
/ 25 сентября 2019

Установите пакет FOS Rest и убедитесь, что у вас установлен сериализатор.Я бы использовал Symfony Serializer

https://symfony.com/doc/master/bundles/FOSRestBundle/1-setting_up_the_bundle.html

В основном он будет выполнять декодирование тела HTTP-запроса и заголовков Accept, которые необходимы для $form->handleRequest($request), которые затем будут отображать форму как отправленную.

0 голосов
/ 23 сентября 2019

Попробуйте удалить $form->handleRequest($request);, handleRequest не работает с вызовами API

Обновление.

Вот простой пример для проверки сущности

Сущность:

use Symfony\Component\Validator\Constraints as Assert;

class SomeClass
{
    /**
     * @Assert\NotBlank
     */
    private $content;
}

FormType:

class SomeType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('content', TextType::class)
        ;
    }

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

FormHandler:

class FormHandler
{
    private $formFactory;

    public function __construct(FormFactoryInterface $formFactory)
    {
        $this->formFactory = $formFactory;
    }

    public function handleWithSubmit(
        array $data,
        string $type,
        $entity,
        array $options = []
    ) {
        $form = $this->formFactory->create($type, $entity, $options);
        $form->submit($data);

        return $this->processSubmitted($form, $entity);
    }

    private function processSubmitted(FormInterface $form, $entity)
    {
        if (!$form->isValid()) {
            return $form->getErrors();
        }

        if (!is_object($entity)) {
            $entity = $form->getData();
        }

        return $entity;
    }
}

Ввести FormHandler в контроллер и вызвать

$handled = $this->formHandler->handleWithSubmit($request->request->all(), SomeType::class, new SomeClass());
if (!$handled instanceof SomeClass) {
    // return errors
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...