在表单中, 某些字段允许为空的情况下, 有可能发生异常信息
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 代码比较麻烦, 建议使用方法二来处理此类问题会比较方便.