验证 symfony 表单以提交 POST 请求时出现问题

刘易斯·戈德文

我正在使用 POST REST 服务来创建一个新的“用户”。

我遵循本教程,它是法语,但我使用的代码应该是相同的。

https://zestedesavoir.com/tutoriels/1280/creez-une-api-rest-avec-symfony-3/developpement-de-lapi-rest/creer-et-supprimer-des-ressources/

因此,当我尝试使用我的 post rest 服务添加用户时,它起作用了。当我添加表单验证来验证我的请求的参数时,每个字段都返回一个错误“此值不应为空。”,但我发送了正确的值

使用 Postman 返回的错误:

{
  "code": 400,
  "message": "Validation Failed",
  "errors": {
    "errors": [
      "This form should not contain extra fields."
    ],
    "children": {
      "firstname": {
        "errors": [
          "This value should not be blank."
        ]
      },
      "lastname": {
        "errors": [
          "This value should not be blank."
        ]
      },
      "email": {
        "errors": [
          "This value should not be blank."
        ]
      }
    }
  }
}

我使用 PostMan 发送此代码:

{
    "firstname": "Jimmy",
    "lastname": "Sample",
    "email": "[email protected]"
}

当我尝试打印时$form->submit($request->request->all());,我得到了一个空数组,所以我想这就是问题所在。请参阅用户控制器代码。

请参阅我使用的代码:

用户

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity()
* @ORM\Table(name="users",
*      uniqueConstraints={@ORM\UniqueConstraint(name="users_email_unique",columns={"email"})}
* )
*/
class User
{
   /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     */
    protected $id;

    /**
     * @ORM\Column(type="string")
     */
    protected $firstname;

    /**
     * @ORM\Column(type="string")
     */
    protected $lastname;

    /**
     * @ORM\Column(type="string")
     */
    protected $email;

    public function getId()
    {
        return $this->id;
    }

    public function setId($id)
    {
        $this->id = $id;
    }

    public function getFirstname()
    {
        return $this->firstname;
    }

    public function setFirstname($firstname)
    {
        $this->firstname = $firstname;
    }

    public function getLastname()
    {
        return $this->lastname;
    }

    public function setLastname($lastname)
    {
        $this->lastname = $lastname;
    }

    public function getEmail()
    {
        return $this->email;
    }

    public function setEmail($email)
    {
        $this->email = $email;
    }
}

用户控制器

<?php
namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use FOS\RestBundle\Controller\Annotations as Rest; // alias pour toutes les annotations
use AppBundle\Form\Type\UserType;
use AppBundle\Entity\User;

class UserController extends Controller
{
[...]
    /**
     * @Rest\View(statusCode=Response::HTTP_CREATED)
     * @Rest\Post("/users")
     */
    public function postUsersAction(Request $request)
    {
        $user = new User();
        $form = $this->createForm(UserType::class, $user);

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

        if ($form->isValid()) {
            $em = $this->get('doctrine.orm.entity_manager');
            $em->persist($user);
            $em->flush();
            return $user;
        } else {
            return $form;
        }
    }
}

用户类型(表单类型)

<?php
namespace AppBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\EmailType;

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('firstname')
            ->add('lastname')
            ->add('email', EmailType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundle\Entity\User',
            'csrf_protection' => false
        ]);
    }
}

验证 YML 文件

AppBundle\Entity\User:
    constraints:
        - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: email
    properties:
        firstname:
            - NotBlank: {message: Noooooon il faut un prénom!!!}
            - Type: string
        lastname:
            - NotBlank: ~
            - Type: string
        email:
            - NotBlank: ~
            - Email: ~

谢谢

拉弗尔

您正在发送一个 json,然后需要对 json 进行解码

    $json = $request->getContent();
    if ($decodedJson = json_decode($json, true)) {
        $data = $decodedJson;
    } else {
        $data = $request->request->all();
    }
    $formData = [];
    foreach ($form->all() as $name => $field) {
        if (isset($data[$name])) {
            $formData[$name] = $data[$name];
        }
    }

    $form->submit($formData);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

提交HTTP POST请求时出现问题

来自分类Dev

验证提交按钮时出现问题

来自分类Dev

提交表单时的jQuery表单验证问题

来自分类Dev

提交表单时出现验证错误

来自分类Dev

提交表单时如何仅验证表单?

来自分类Dev

表单提交/验证后,Symfony2设置Entity属性

来自分类Dev

关于提交表单的验证有问题吗?

来自分类Dev

表单提交问题之前的jQuery Ajax验证

来自分类Dev

JavaScript表单验证提交按钮问题

来自分类Dev

symfony发送表单请求而不提交

来自分类Dev

Angular ngMessage:在表单提交时验证

来自分类Dev

验证失败时阻止表单提交

来自分类Dev

AngularJS表单拒绝提交时进行验证

来自分类Dev

JavaScript表单验证,当数据无效时提交

来自分类Dev

提交表单时如何防止Parsley验证

来自分类Dev

验证失败时如何提交表单

来自分类Dev

提交时进行AJAX表单验证

来自分类Dev

提交表单时未执行JavaScript验证

来自分类Dev

验证失败时,无法阻止表单提交

来自分类Dev

在表单提交时验证文本框

来自分类Dev

Symfony 2表单验证

来自分类Dev

POST请求时无法通过验证表单(Springboot)

来自分类Dev

POST请求提交表单并获取结果

来自分类Dev

jQuery AJAX表单POST提交问题

来自分类Dev

嵌套表单:提交时不验证内部表单

来自分类Dev

Symfony表单验证基本表单

来自分类Dev

保存和验证来自表单输入的临时虚拟属性时出现问题

来自分类Dev

使用Symfony 3表单插入DateType字段时出现问题

来自分类Dev

使用Symfony 3表单插入DateType字段时出现问题