Validators são classes que serão usadas para verificar se os valores contidos em cada campo estão de acordo com regras pré-estipuladas. A biblioteca do framework já possui alguns validators prontos para uso, mas as vezes é necessário implementarmos os nossos.
Um validator qualquer deve sempre herdar da classe \Zend\Validator\AbstractValidator e consequentemente implementar o método isValid($value). Esse método que será chamado pelo framework quando for verificar a validade do campo caso ele esteja no ValidationGroup e passando como parâmetro o valor que está no campo. Vamos ver um exemplo de um validator customizado.
namespace Application\Form\Validator
use \Zend\Validator\AbstractValidator
class MyValidator extends AbstractValidator {
/**
* Returns true if and only if $value meets the validation requirements
*
* If $value fails validation, then this method returns false, and
* getMessages() will return an array of messages that explain why the
* validation failed.
*
* @param mixed $value
* @return bool
* @throws Exception\RuntimeException If validation of $value is impossible
*/
public function isValid($value)
{
if (empty($value)) {
return false;
}
return true;
}
}
|
Mensagens de erro
Nosso validator verifica se o valor é falso, 0, null ou “”(vazio) através do método empty(), e caso seja, ele retornará falso e fará consequentemente com que o método isValid() do formulário retorne falso mesmo que outros validators tenha resultado em verdadeiro.
Os validators também permitem que você retorne um mensagem de erro, que por padrão aparecerá abaixo do campo e em cores vermelhas. Para que isso ocorra devemos primeiros criar as mensagens sobrescrevendo o atributo $messageTemplates passando um vetor contendo mensagens, que no nosso caso só será uma: “Este campo não pode ser vazio!”.
Criada nossa mensagem podemos executá-la quando quisermos através do método error() da classe AbstractValidator e passando como parâmetro a key do vetor referente a mensagem que gostariamos de exibir. Sendo assim ficaria assim a exibição de erros.
namespace Application\Form\Validator
use \Zend\Validator\AbstractValidator
class MyValidator extends AbstractValidator {
const IS_EMPTY = ‘isEmpty’;
/**
* @var array
*/
protected $messageTemplates = array(
self::IS_EMPTY => “Este campo não pode ser vazio!”,
);
/**
* Returns true if and only if $value meets the validation requirements
*
* If $value fails validation, then this method returns false, and
* getMessages() will return an array of messages that explain why the
* validation failed.
*
* @param mixed $value
* @return bool
* @throws Exception\RuntimeException If validation of $value is impossible
*/
public function isValid($value)
{
if (empty($value)) {
$this->error(self::IS_EMPTY);
return false;
}
return true;
}
}
|
Criado nosso validator, podemos inserí-lo agora no InputFilter.
namespace Application\Form;
use Zend\Form;
class MyForm extends Form {
function __contruct() {
$this->setAttribute(‘method’, ‘post’);
$this->setAttribute(‘id’, ‘my-form’);
//..Add fields with $this->add()
$myValidator = new Validator\MyValidator();
$this->setInputFilter(
new Factory()->createInputFilter(
array(
‘sex’ => array (
‘required’ => true,
‘validators’ => array(
$myValidator
)
),
‘name’ => array (
‘allow_empty’ => false,
‘validators’ => array(
array(‘name’ => ‘Application\Validator\Form\MyValidator’)
)
),
)
)
);
$this->setValidationGroup(
array(
‘security’,
‘sex’,
‘name’,
)
);
}
}
|
Veja que isso pode ser feito de duas maneira, ou diretamente, que é recomendado quando você tem um validator que exige algum tipo de parâmetro no construtor, ou por modo indireto, fica factory.