Como traduzir o validator Csrf – Laminas Framework

Se você esta acostumado a utilizar os formulários do Laminas Form (antigo Zend Form), você já deve ter tentado utilizar o elemento Csrf:

Laminas\Form\Element\Csrf

Se você foi inocentemente utilizar ele nos validadores com InputFilterProviderInterface através do getInputFilterSpecification para traduzi-lo deve ter se deparado com o seguinte problema, toda vez que você tenta salvar o formulário o erro de tempo de inatividade é apresentado:

The form submitted did not originate from the expected site

Provável forma errada que você utilizou

public function getInputFilterSpecification() {
 return array(
  'security' => [
            'required' => true,
            'validators' => array(
                array(
                    'name' => 'notSame',
                    'options' => array(
                        'messages' => array(
                            'isEmpty' => 'O formulário ficou inativo por muito tempo.'
                        )
                    )
                )
            )
        ];
 );
}

Porém o elemento do tipo CSRF já é validado por padrão e quando você tenta especificar ele dentro do getInputFilterSpecification ele é validado novamente, opa! Então o elemento acaba sendo validado 2 vezes, porém quando ele é validado pela primeira vez ele apaga o hash de validação e quando ocorre a segunda validação é retornado erro, pois ele compreende que não existe mais o hash daquele formulário.

Então como eu posso traduzir esse elemento? Simples, passe todos os parâmetros diretamente na chamada do elemento:

        $csrf = new \Laminas\Form\Element\Csrf('security');
        $csrf->setOptions(['csrf_options' => [
            'timeout' => 900,
            'messageTemplates' => ['notSame' => 'O formulário esta inativo por muito tempo, tente enviar novamente.'],
            ]]);
        $this->add($csrf);

Estou postando essa curiosidade, pois quando eu passei por essa situação pesquisei muito e nada encontrei, então fucei até encontrar essa solução, espero que possa ajudar mais alguém.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *