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.