php - Symfony 表单未更改字段返回验证类型错误

标签 php symfony symfony-forms symfony-4.3

尝试更新实体并提交一个值未更改的字段会导致类型错误。我做错了什么?

实体:

<?php

namespace App\Entity;

use Symfony\Component\Validator\Constraints as Assert;
...
class User implements UserInterface
{
...

    /**
     * @ORM\Column(type="bigint", nullable=true)
     * @Groups({"default", "listing"})
     * @Assert\Type("integer")
     */
    private $recordQuota;

...

表单类型:

<?php

namespace App\Form;

...

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
...
            ->add('recordQuota', IntegerType::class)
        ;
    }

...
}

Controller :

...
    /**
     * @Route("/api/user/{id}", name="editUser")
     * @Method({"PUT", "PATCH"})
     * @Rest\View()
     */
    public function updateAction(Request $request, User $user)
    {
        $form = $this->createForm(UserType::class, $user);
        $data = $request->request->get('user');
        $clearMissing = $request->getMethod() != 'PATCH';

        $form->submit($data, $clearMissing);


        if ($form->isSubmitted() && $form->isValid()) {
...

我正在使用 PostMan 提交表单数据。 如果我正在更新的实体的 recordQuota 为 1000,并且我提交具有不同值的表单。一切正常并不断更新。

但是如果我使用 recordQuota: 1000 提交我的表单,它应该保持值不变,我得到一个不正确的类型错误:

            "recordQuota": {
                "errors": [
                    "This value should be of type integer."
                ]
            }

附加信息:

我正在使用 $form->submit 而不是 handleRequest 因为我正在使用补丁。所以我需要能够启用/禁用 $clearMissing。但即使使用 handleRequest 也会产生同样的问题。

即使在将 recordQuota 传递给表单之前将其类型转换为 int 仍然会失败。

如果我从表单和实体中删除所有类型信息,在实际进行更改时会得到“此值应为字符串类型”。

最佳答案

编辑:请注意,如果字段类型为 TextType,则以下内容为真,但是IntegerType适用于 @Assert\Type("integer") .这有点使我的回答无效/不相关...

您正在使用 @Assert\Type("integer")注释,但它的意思是:

  • 值必须是整数 -- 作为 PHP 类型,比如调用 is_int($value)
  • 并且由于数据来自表单(并且可能没有任何转换器,正如我在您的代码中看到的那样),它的类型是 string
  • 因此,验证总是失败

你需要的是@Assert\Type("numeric") :

  • 相当于is_numeric($value)
  • 当它到达您实体的字段时,它将被转换为字符串

关于php - Symfony 表单未更改字段返回验证类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56734818/

相关文章:

php - 使用php从MySQL数据库下载word文档

javascript - 如何将数据显示为html表格?

php - 表单处理 : "bind" is deprecated in symfony 2. 3 - "submit"也不起作用

mongodb - 使用相同的实体/文档类通过 Doctrine 在 MongoDB 和 MySQL 中存储数据

php - 了解 PDO 准备语句和绑定(bind)参数

php - Zend 2 条件验证器

php - Symfony2,设置日期时间字段的默认值

rest - 如何使用 Symfony2 Forms 和 REST 修补集合?

symfony - 来自 Controller 的 CSRF token

Symfony2 数据转换器、验证器和错误消息