Zend Filter - Aprendendo criar filtros customizados
Se você já leu a minha sequência de posts sobre o Zend Form ou já sabe como trabalhar com forms, deve conhecer o Zend Filter, certo? Hoje mostrarei como criar seus próprios filtros e vinculá-los em seus forms.
Antes de qualquer coisa
Caso ainda não saiba trabalhar com o Zend Form, sugiro a leitura destes posts:
Zend Form - Trabalhando com formulários no Zend 2 e 3 e Zend Form - Injeção de dependências. Este último é apenas um plus, não é necessário o ler para entender o que será feito aqui.
O que é o Zend Filter?
É um componente do Zend Framework que possibilita muitos tipos de filtros para uso nas mais diversas situações. Ele pode ser utilizado em formulários, "hidratação" de dados para views, etc. É possível o utilizar no ZF, outros frameworks e até mesmo sem, apenas utilizando o Composer pra gerenciar tudo.
Por que usar Zend Filter?
Um dos benefícios é que você já tem diversos filtros prontos para utilizar, tais como StringTrim, StripTags, ToInt e muitos outros, veja a lista completa no GitHub. Além de tudo o que já está pronto, você pode criar outros filtros conforme sua necessidade. São exemplos de filtros que você pode criar: aplicar/remover máscara em CPF, CNPJ, telefone, placa de veículos, números de protocolos e apólices, etc.
Estrutura básica de um filtro
namespace Application\Filter;use Zend\Filter\FilterInterface;
class MyFilter implements FilterInterface
{
public function filter($value)
{
// perform some transformation upon $value to arrive on $valueFilteredreturn $valueFiltered;
}
}
Bem simples, não? Veja no código acima que tudo o que precisamos fazer é implementar uma interface e pronto!
Vamos agora criar nosso filtro pra aplicar máscara em CPF?
CPFMaskFilter
namespace Application\Filter;use Zend\Filter\FilterInterface;
class CPFMaskFilter implements FilterInterface
{
/**
* @inheritdoc
*/
public function filter($value)
{
// removendo qualquer "poluição" da string e obtendo somente os dígitos
$value = preg_replace("/\D/", '', $value);
// Validando se o CPF possui a quantidade certa de caracteres
if (strlen($value) !== 11) {
return '';
}// Definindo padrões: 3 sequências com 3 dígitos e uma com 2
$pattern = "/(\d{3})(\d{3})(\d{3})(\d{2})/";// as duas primeiras sequências de 3 dígitos são separadas por um ponto,
// a última, por um hífen
$replacement = "\$1.\$2.\$3-\$4";// aplicando a máscara e retornando o valor filtrado
return preg_replace($pattern, $replacement, $value);
}
}
Agora é só usar no seu form filter.
InputFilter
// module/Application/src/Form/ExampleFormFilter$inputFilter->add([
'name' => 'cpf',
'required' => true,
'filters' => [
// ...
['name' => \Application\Filter\CPFMaskFilter::class],
],
'validators' => [
// ...
],
]);
Pronto! Agora pode criar filtros conforme sua necessidade.
Como usar fora do FormFilter
O mais legal é que esse filtro não é limitado somente ao uso em Form Filters, você pode o utilizar para qualquer finalidade. Veja um exemplo de como o utilizar na view para apresentar o CPF formatado corretamente.
Primeiro cria-se um ViewHelper.
namespace Application\View\Helper;use Application\Filter\CPFMaskFilter;
use Zend\View\Helper\AbstractHelper;class CPFMaskViewHelper extends AbstractHelper
{
public function __invoke($cpf)
{
// Este ViewHelper que criamos apenas delega o trabalho ao filtro que criamos anteriormente
return (new CPFMaskFilter())->filter($cpf);
}
}
Em seguida um alias para o mesmo, para utilizarmos na view.
// module/Application/src/Module.phppublic function getViewHelperConfig()
{
return [
'invokables' => [
// ...
'cpfMask' => \Application\View\Helper\CPFMaskViewHelper::class
]
];
}
Na view
E por fim, o utilizando na view.
Com .phtml (padrão do Zend)
<?php echo $this->cpfMask('12345678901'); ?>
Com Twig
{{ cpfMask('12345678901') }}
Em ambos os exemplos a saída é: 123.456.789-01
That's all!
Lembre-se, filtro != validador.
Enquanto o validador tem o papel de criar asserções para uma determinada regra, o filtro apenas "hidrata" os dados recebidos. Desta forma, se por algum motivo o usuário informar um CPF como este 000.....000.000--00, somente pra testar uma possível vulnerabilidade, o filtro deixará o resultado assim: 000.000.000-00. Caso passe com um dígito a mais em qualquer posição, será feita a "limpeza" e, se o resultado for algo diferente de 11 caracteres, o retorno será uma string vazia.
Assim como já explicado nos posts anteriores sobre o Zend Form, o filtro é mais uma camada de segurança para sua aplicação. O usuário mal intencionado pode facilmente desativar o JavaScript e passar por toda e qualquer validação pelo lado do browser, mas não terá este mesmo poder com o server. Por isso é importante ter filtros e validações nas duas extremidades.