[041] Symfony4 表单验证 NULL 异常处理

在表单中, 某些字段允许为空的情况下, 有可能发生异常信息

Expected argument of type "string", "NULL" given at property path "name"
  • 这个情况是发生在 Form 的 handleRequest() 阶段, 表单的值并未进入验证步骤中.
  • 这个情况发生在给创建表单的对象中传入了实体类. 这个异常是由这个实体类发生的.

通常对于未填写值的表单, SF的Form会统一默认为 null, 由于这个原因, 由 make:entity 创建是实体类, 我们来看一下代码片段:

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

由于 Setter 方法的参数声明了需要接受 string 类型的参数, 然而 Form 给传入了一个 null, 所以抛出了异常. 问题发现了就比较好解决了.

  • 解决办法一: 修改实体类的函数定义, 使它能够接受 null 类型参数. 如下:
    public function setName(?string $name): self
    {
        $this->name = (string)$name;

        return $this;
    }

这PHP7.1版本之后, 函数的参数类型声明支持 可空类型 (在参数类型前增加一个问号?), 对于函数返回的结果类型也同样支持这一的声明.

  • 解决办法二: 修改创建 Form 时的属性, 给可选的或者会为空的表单自动添加一个默认空值(empty_data). 看起来像这样:
$formBuilder = $this->createFormBuilder($user);

//原来的表单声明
$formBuilder->add('name', TextType::class); 

//新的表单声明
$formBuilder->add('name', TextType::class, ['empty_data' => '']);

由于修改 Entity 代码比较麻烦, 建议使用方法二来处理此类问题会比较方便.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容