Laminas,将过滤后的字段集输入值传递给验证器工厂时出现问题

Laminas, problem with passing filtered fieldset inputs values to validator factory

我用的是最新版本的Laminas。我有一个通过 init() 添加到表单的字段集,它被设置为基本字段集。如果你在 fieldset 中定义 getInputFilterSpecification(),在 Laminas 框架更新之前(我必须承认,我有几个月没有更新),我可以通过调用 $this->get('someName')->getValue() 在字段集的 getInputFilterSpecification() 中。这非常方便,因为如果你有一个通过工厂初始化的复杂验证器,并且你想将其他输入的值传递给这个验证器以实现复杂逻辑,你只需将需要的输入值分配给验证器中的 'options' ,像这样:

'someInputName' => [
    'required' => false,
    'filters' => [
        ['name' => StripTags::class],
        ['name' => StringTrim::class],
        ...
    ],
    'validators' => [
        ['name' => NotEmpty::class],
        [
            'name' => AComplexValidator::class,
                'options' => [
                    'parameter1' =>
                        $this->get('otherName1')->getValue(),
                    'parameter2' =>
                        $this->get('otherName2')->getValue(),
                ],
        ],
        ...
    ],
],

parameter1parameter2已经得到输入的过滤值,所以不需要在验证器中重新处理值。现在那里只提供原始的、未过滤的值 $this->get('otherName2')->getValue()

有没有办法为验证器工厂提供字段集输入的过滤值?还是我完全错了?

正确的做法是使用isValid()中的第二个参数$context:

<?php
class AComplexValidator extends AbstractValidator
{
    public function isValid(mixed $value, ?iterable $context = null): bool {
        // $context will contain all other field values of the Fieldset
    }
}

相同的验证器正在使用这个,例如:https://github.com/laminas/laminas-validator/blob/2.16.x/src/Identical.php#L165