在表單中, 某些字段允許為空的情況下, 有可能發生異常信息
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 代碼比較麻煩, 建議使用方法二來處理此類問題會比較方便.