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.