es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Láminas, problema con pasar los valores de entrada del conjunto de campos filtrados a la fábrica de validadores.

Utilizo la versión más reciente de Laminas. Tengo un fieldset que se agrega a un formulario a través de init() y se establece como un fieldset base. Si defines getInputFilterSpecification() en el fieldset, antes de la actualización del framework Laminas (debo admitir que no actualicé durante un par de meses), podía recuperar los valores filtrados de las entradas del fieldset simplemente llamando a $this->get('someName')->getValue() dentro de getInputFilterSpecification() del fieldset. Esto era muy conveniente, porque si tienes un validador complejo con inicialización a través de una fábrica y quieres pasar los valores de otras entradas a este validador para una lógica compleja, solo tenías que asignar los valores de entrada necesarios a 'options' en el validador, de la siguiente manera:

'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(),
            ],
        ],
        ...
    ],
],

Y parameter1 y parameter2 ya tenían los valores filtrados de las entradas, por lo que no era necesario volver a procesarlos en el validador. Ahora solo se proporcionan valores sin procesar sin filtrar allí $this->get('otherName2')->getValue().

¿Hay alguna manera de suministrar los valores filtrados de las entradas del fieldset a la fábrica de validadores? ¿O estoy haciendo esto completamente mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el comportamiento de getInputFilterSpecification() ha cambiado en la versión reciente de Laminas. En el pasado, podías obtener los valores filtrados de los inputs del fieldset simplemente llamando $this->get('someName')->getValue() dentro de getInputFilterSpecification() del fieldset. Sin embargo, esto ya no parece ser el caso.

    Para proporcionarle al factory de validadores los valores filtrados de los inputs del fieldset, puedes obtener el objeto de filtro de entrada del form usando $form->getInputFilter() y luego obtener los valores desde allí. Por ejemplo:

    public function getInputFilterSpecification()
    {
        $inputFilter = $this->getInputFilter();
        $someValue = $inputFilter->get('someName')->getValue();
    
        return [
            // ...
        ];
    }
    

    Alternativamente, podrías pasar los valores filtrados como argumentos de constructor a tu factory de validadores y luego pasarlos a tu validador. Por ejemplo:

    public function getInputFilterSpecification()
    {
        $validatedValue = $this->get('someName')->getValue();
    
        $someValidator = $this->validatorFactory->create([
            'parameter1' => $validatedValue,
            'parameter2' => $this->get('otherName2')->getValue(),
        ]);
    
        return [
            'someName' => [
                'required' => false,
                'filters' => [
                    ['name' => StripTags::class],
                    ['name' => StringTrim::class],
                    // ...
                ],
                'validators' => [
                    ['name' => NotEmpty::class],
                    [$someValidator],
                    // ...
                ],
            ],
        ];
    }
    

    En este ejemplo, el valor filtrado de someName se pasa al factory de validadores como argumento parameter1. El valor sin filtrar de otherName2 se obtiene directamente del fieldset usando $this->get('otherName2')->getValue().

    En general, hay diferentes formas de lograr tu objetivo y el enfoque que elijas dependerá de tus requisitos y preferencias específicas.

Comments are closed.