Symfony 3.2 привязывает пост-значения к форме в REST API

Я использую следующие библиотеки/технологии:

JMSSerializer, FOSRestBundle + Symfony 3.2 + PHP 7.1

Когда я пытаюсь сделать POST-запрос к моей конечной точке POST, я не могу заставить форму работать.

Файлы:

Country.php -> Объект POPO

CountryType.php

<?php

declare(strict_types = 1);
namespace AppBundle\Form;

use AppBundle\Model\Entity\Country;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class CountryType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name' , TextType::class)
            ->add('iso_alpha
public function postAction(Request $request)
    {
        $country = new Country();
        $form = $this->createForm(CountryType::class,  $country);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            die('ok');
            // TODO INSERT DATA then redirect
            return $this->routeRedirectView('get_country', ['id' => $country->getId()]);
        }

        return $this->get('fos_rest.view_handler')->handle(View::create($form));
    }
code', TextType::class) ->add('iso_alpha$form->getData()code', TextType::class) ->add('is_numeric_code', IntegerType::class); } public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => Country::class, 'csrf_protection' => false, ]); } /** * @inheritdoc */ public function getName() : string { return ''; } }

CountryController.php postAction

public function postAction(Request $request)
    {
        $country = new Country();
        $form = $this->createForm(CountryType::class,  $country);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            die('ok');
            // TODO INSERT DATA then redirect
            return $this->routeRedirectView('get_country', ['id' => $country->getId()]);
        }

        return $this->get('fos_rest.view_handler')->handle(View::create($form));
    }

Проблема в том, что он не входит в блок if, потому что оба метода isSubmited() и isValid() возвращают false. Когда я вызываю $form->getData(), он возвращается

CountryController.php on line 40: Country {#306 -id: null -name: null -isoAlpha2Code: null -isoAlpha3Code: null -isNumericCode: null }

Запрос, который я делаю:

Запрос к API

Не подскажете, что я делаю не так?


person Robert    schedule 12.04.2017    source источник


Ответы (2)


Вот как я отправляю форму при использовании пакета FOSRest, надеюсь, это направит вас в правильном направлении. Это пример регистрационного действия. Вы заметите, что вам нужно отправить форму вручную

$form->submit($request->request->all());, а затем проверьте, действителен он или нет

public function postRegistrationAction(Request $request){
    $form = $this->createForm(UserType::class, null, [
        'csrf_protection' => false,
    ]);
    $form->submit($request->request->all());
    if (!$form->isValid()) {
        return $form;
    }
    /**
     * @var $user User
     */
    $user = $form->getData();
    $em = $this->getDoctrine()->getManager();

    //Set the user role
    $user->setRoles(array('ROLE_USER'));

    //Encode the password
    $password = $request->request->get('password');
    $encodedPassword = $this->get('security.password_encoder')->encodePassword($user, $password['first']);
    $user->setPassword($encodedPassword);

    $token = $this->get('lexik_jwt_authentication.encoder')->encode(['username' => $user->getUsername(), 'role' => $user->getRoles(), 'name' => $user->getName()]);

    $em->persist($user);
    $em->flush();
    $view = FOSView::create();
    $view
        ->setData(['token' => $token])
        ->setStatusCode(200);
    return $view;
}
person Baig    schedule 13.04.2017
comment
На самом деле это было очень полезно. Суть в том, что мне нужно отправить форму в коде с параметрами из запроса. Однако ваш код не будет работать, потому что, когда я возвращаю только $form, как вы, я получаю, что действие контроллера ошибок должно возвращать ответ - person Robert; 13.04.2017
comment
затем вы попытались поместить свою логику в оператор if после отправки формы, например if ($form->isValid()) {....} - person Baig; 13.04.2017
comment
да, после того, как я использовал $form->submit($request->request->all()), это сработало - person Robert; 13.04.2017
comment
рад узнать, что это помогло. - person Baig; 13.04.2017

Мне удалось получить данные, используя следующие строки

    $user = new User;
    $form = $this->createForm(UserType::class, $user);
    $form->submit($request->request->all());
    if($form->isValid()){
       //persist or do anything
       return $user;
    }
    return 'There were an error in your form';
person Bellash    schedule 16.08.2018