Validation in the view is only used to avoid an "invalid" request, but this validation should not be trusted since the user can change it.
The most reliable validation is done on the server, this question of doing it in the controller or model is very conceptual, it goes from your organization / methodology, in both cases it will work.
By using Zend Framework 2, I created the custom to create an object for form (which turns the form into html) and another object for filtering and validating the data, both objects are part of the Model layer because it contains business rules , but are handled in the controller, I think this is a well organized way and I recommend it.
Here's an example:
class ProdutosController
{
/**
* Este action insere produto no banco de dados
*/
public function addAction()
{
$requisicao = $this->getRequisicao(); // requisição
$dados = $requisicao->getPost(); // dados enviados pelo form
$entidade = $this->getEntidade; // entidade, mapeamento da tabela produtos do banco de dados
$model = $this->getModel(); // model, classe que conversa diretamente com o BD
$form = $this->getForm(); // Objeto form para montar formulário HTML
// Se requisição for post, é porque usuário enviou o formulário
// caso contrário é GET então ele está visualizando o form de inserção
if ($requisicao->isPost()) {
// Injeta objeto que filtra e valida os dados
$form->setInputFilter($entidade->getInputFilter());
// Joga os dados enviados pelo form HTML pra dentro do objeto form
// assim será possível valida-los e outras ações que são feitas pelo objeto form
$form->setDados($dados);
// Verifica se o form foi validado com sucesso (executa validações do inputFilter)
if ($form->isValid()) {
// hidrata/popula a entidade com os dados que estavam no form
$entidade->hidratar($form->getDados());
// insere a entidade no banco de dados
$model->insert($entidade);
// Após inserção, redireciona para listagem
$this->redirect()->toRoute('produtos/lista');
}
}
// Caso requisição não seja POST ou caso validação do form tenha falhado
// então carregar a view
// caso validação do form tenha falhado, vai enviar as msgs de erro para a view tb
// retornar um array é o jeito do Zend de enviar variáveis para a view
return array(
'variavel1' => 'valor1',
'variavel2' => 'valor2',
'variavel3' => 'valor3',
'form' => $form,
);
}
}