我正在尝试验证一个包含绝对不能为空或null的字段的表单。所以在我的模型中,它是这样定义的:
/**
* @var string
*/
private $end;
/**
* @param string $end
* @return Blabla
*/
public function setEnd(string $end): Blabla
{
$this->end = $end;
return $this;
}
以下是我的表单中对该字段的验证:
$builder
->add('end', TextType::class, [
'label' => 'blabla',
'constraints' => [
new Length([
'min' => 3,
'minMessage' => 'Min {{ limit }} chars',
]),
new NotBlank([
'message' => 'not null blabla',
]),
],
])
这里是当我发送错误的输入时我接收到的错误;多个空间":Expected argument of type "string", "null" given at property path "end".
我可以通过添加在我的setter 中接收null的可能性来纠正这个错误
/**
* @var string|null
*/
private $end;
/**
* @param string|null $end
* @return blabla
*/
public function setEnd(?string $end=null): blabla
{
$this->end = $end;
return $this;
}
但我发现,允许字段接收null只是为了验证它,并防止将字段设置为null值,这不是很一致。
难道我们不能做别的吗?
提交表单时,所有空值默认设置为null
,因此您应该在setter中接受null
,或者使用empty_data
自定义默认值:
型号:
#[AssertNotBlank]
private string $end = ''; // Remember to initialise the field with empty string if you use typed properties
public function setEnd(string $end): void
{
$this->end = $end;
}
形式:
$builder->add('end', TextType::class, [
'label' => 'blabla',
'empty_data' => '',
]);
由于NotBlank
检查空字符串,所以您仍然可以通过这种方式使用它。这适用于一些内置字段,如TextType
,但在其他字段中仍可能将空字符串转换为null
,因为DataTransformers也应用于empty_data
:docs
表单数据转换器仍将应用于empty_data值。这意味着一个空字符串将被强制转换为null。如果明确希望返回空字符串,请使用自定义数据转换器。
如果要对表单类型中的null
处理进行成本计算,请添加自定义DataTransformer
或直接在表单类型中实现DataTransformerInterface
,就像在TextType
中一样:https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Form/Extension/Core/Type/TextType.php
请注意,我使用了一些现代PHP功能(属性和类型化属性)来缩短代码。