1

文档 https://symfony.com/doc/4.4/reference/constraints/Length.html#normalizer 指出

此选项允许在检查给定值是否有效之前定义应用于给定值的 PHP 可调用对象。

例如,您可能希望传递“trim”字符串以应用 trim PHP 函数,以便在验证期间忽略前导和尾随空格。**

我可以像示例中那样调用 trim,甚至可以调用该类的静态函数:

class PersonDto
{
    /**
     * @Assert\Length(min="1", max="255", allowEmptyString=false, normalizer="App\Dto\PersonDto::foo")
     */
    private ?string $name = null;

    public static function foo($value) {
        $value = 'the text has been replaced';
        return $value;
    }

    ...
}

但是由于某种原因,返回的值不会改变值。我在做什么错,或者如何将回调函数写入“规范化器”选项

4

1 回答 1

2

Symfony 验证器不会更改您传递给它验证的值,它只是检查它们是否符合您分配的约束。因此,在您的情况下,它会在检查长度时使用修剪以确保它有效,但会保留 DTO 属性供您处理。

我假设使用 fosrestbundle 标记,您一直在使用请求正文转换器侦听器将直接传递的数据转换为 DTO?

当需要类似的东西时,我所做的是使用 Symfony 序列化器从请求数据中生成我的 DTO,并使用它自己的非规范化器,这通过它期望的字段并通过修剪来准备数据,如果它是字符串等,然后手动将其传递给验证器。

于 2020-08-26T00:09:38.070 回答