Symfony 4.2验证实体的空浮子字段



我正在尝试为具有字符串和浮动类型的表单编写验证器。如果我正在创建一个未存储到数据库的新对象,那么一切都很好。但是,如果我正在编辑一个存储在数据库中的对象,并且将字符串或浮点值设置为空,我将获得

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;
}

最新更新