不可为null的字段上的Validation NotBlank



我正在尝试验证一个包含绝对不能为空或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功能(属性和类型化属性)来缩短代码。

相关内容

  • 没有找到相关文章

最新更新