我正在尝试为具有字符串和浮动类型的表单编写验证器。如果我正在创建一个未存储到数据库的新对象,那么一切都很好。但是,如果我正在编辑一个存储在数据库中的对象,并且将字符串或浮点值设置为空,我将获得
Expected argument of type "float", null given at property path "price"
错误。
字符串字段的解决方法正在设置
'empty_data' => '',
或创建这样的数据变压器
<?php
namespace AppFormDataTransformer;
use SymfonyComponentFormDataTransformerInterface;
class NullToEmptyTransformer implements DataTransformerInterface
{
/**
* Does not transform anything.
*
* @param string|null $value
*
* @return string
*/
public function transform($value)
{
return $value;
}
/**
* Transforms a null to an empty string.
*
* @param string $value
*
* @return string
*/
public function reverseTransform($value)
{
if (is_null($value)) {
return '';
}
return $value;
}
}
但不能将其应用于浮点场。验证空浮子字段的最佳解决方案是什么,该字段以前在数据库中具有值?
编辑:我发现了解决方案。问题在于实体设定器。它只是期望只浮动,所以我必须将参数类型更改为float。
为什么不使用断言?首先,您需要安装注释
composer require symfony/validator doctrine/annotations
当您想在实体上使用它时,请导入它:
use SymfonyComponentValidatorConstraints as Assert;
这就是您必须在实体的属性上使用的方式:
/**
* @AssertNotBlank
* @AssertLength(min=3)
*/
private $firstName;
这些是断言的一些例子:
* @AssertType(type="string")
* @AssertType(type="float")
* @AssertNotBlank()
有关更多信息https://symfony.com/doc/current/validation.html#properties
问答者以答案对我有用的答案更新了他的问题,以解决他遇到的错误:
unuffult php异常symfony component propertyAccess exception invalidargumentException:'type'float的预期参数"在物业路径上给予...
我最初已经阅读了他的编辑备注,因为在任何答案或评论中没有给出的解决方案:
问题是在该领域的设置中。它只期望浮动,所以我不得不将参数类型更改为?float
由于设置器不接受空值,因此抛出了异常,而不是验证错误。为了解释这一点:设置器需要能够接受来自表单的所有可能值,以便触发验证。
我的工作代码示例是:
是:/**
* @ORMColumn(type="float", nullable=true)
* @AssertNotBlank(groups={"selling"})
* @AssertPositiveOrZero(groups={"selling"})
* @AssertType(type="float", groups={"selling"})
*/
private $price;
public function setPrice(?float $price): self
{
$this->price = round($price,2);
return $this;
}