Ótima pergunta!
Em termos de desenvolvimento na World Wide Web, e se você perguntasse o seguinte, também.
"Se uma entrada incorreta do usuário for fornecida a um controlador a partir de uma interface com o usuário, o controlador deve atualizar o View em um tipo de loop cíclico, forçando comandos e dados de entrada a serem precisos antes de processá-los ? Como? Como? Como o modo de exibição é atualizado normalmente? É uma visão fortemente acoplada a um modelo? A validação de entrada do usuário é a lógica de negócios principal do modelo, ou é preliminar a ele e, portanto, deve ocorrer dentro do controlador (porque os dados de entrada do usuário fazem parte da solicitação)?
(Com efeito, pode e deve-se atrasar a instanciação de um modelo até que boas informações sejam adquiridas?)
Minha opinião é que os modelos devem gerenciar uma circunstância pura e pura (o máximo possível), livre da validação básica de entrada de solicitação HTTP que deve ocorrer antes da instanciação do modelo (e definitivamente antes que o modelo obtenha dados de entrada). Como gerenciar dados de estado (persistentes ou não) e relacionamentos de API é o mundo do modelo, permita que a validação básica de entrada de solicitação HTTP ocorra no controlador.
Resumindo.
1) Valide sua rota (analisada a partir da URL), pois o controlador e o método devem existir antes que qualquer outra coisa possa avançar. Definitivamente, isso deve acontecer no domínio do controlador frontal (classe Router), antes de chegar ao verdadeiro controlador. Duh. :-)
2) Um modelo pode ter muitas fontes de dados de entrada: uma solicitação HTTP, um banco de dados, um arquivo, uma API e, sim, uma rede. Se você deseja colocar toda a validação de entrada no modelo, considere a validação de entrada de solicitação HTTP parte dos requisitos de negócios do programa. Caso encerrado.
3) No entanto, é míope passar pela despesa de instanciar muitos objetos se a entrada da solicitação HTTP não for boa! Você pode saber se ** entrada de solicitação HTTP ** é boa ( que veio com a solicitação ) validando-a antes de instanciar o modelo e todas as suas complexidades (sim, talvez ainda mais validadores para API e DB de dados de entrada / saída).
Teste o seguinte:
a) O método de solicitação HTTP (GET, POST, PUT, PATCH, DELETE ...)
b) Controles HTML mínimos (você tem o suficiente?).
c) Máximo de controles HTML (você tem muitos?).
d) Controles HTML corretos (você tem os corretos?).
e) Codificação de entrada (normalmente, é a codificação UTF-8?).
f) Tamanho máximo da entrada (alguma das entradas está muito fora dos limites?).
Lembre-se, você pode obter seqüências de caracteres e arquivos, portanto, aguardar o modelo instanciar pode ficar muito caro à medida que as solicitações atingirem o servidor.
O que descrevi aqui ocorre com a intenção da solicitação que chega pelo controlador. Omitir a verificação de intenção deixa seu aplicativo mais vulnerável. A intenção só pode ser boa (seguindo suas regras fundamentais) ou ruim (indo além de suas regras fundamentais).
A intenção de uma solicitação HTTP é uma proposta de tudo ou nada. Tudo passa ou a solicitação é inválida . Não há necessidade de enviar nada para o modelo.
Esse nível básico de intenção de solicitação HTTP não tem nada a ver com erros e validação regulares de entrada do usuário. Nos meus aplicativos, uma solicitação HTTP deve ser válida das cinco maneiras acima para que eu a honre. Em uma defesa em profundidade maneira de falar, você nunca chegar a validação de entrada do usuário no lado do servidor, se nenhum destes cinco coisas falham.
Sim, isso significa que mesmo a entrada do arquivo deve estar em conformidade com as suas tentativas de front-end para verificar e informar ao usuário o tamanho máximo do arquivo aceito. Apenas HTML? Sem JavaScript? Tudo bem, mas o usuário deve ser informado das consequências do upload de arquivos muito grandes (principalmente, que eles perderão todos os dados do formulário e serão expulsos do sistema).
4) Isso significa que os dados de entrada da solicitação HTTP não fazem parte da lógica de negócios do aplicativo? Não, apenas significa que os computadores são dispositivos finitos e os recursos devem ser usados com sabedoria. Faz sentido interromper atividades maliciosas mais cedo ou mais tarde. Você paga mais em recursos de computação pela espera para interrompê-lo mais tarde.
5) Se a entrada da solicitação HTTP estiver incorreta, a solicitação inteira estará incorreta . É assim que eu olho para isso. A definição de boa entrada de solicitação HTTP é derivada dos requisitos de negócios do modelo, mas deve haver algum ponto de demarcação de recurso. Por quanto tempo você deixará um pedido ruim permanecer antes de matá-lo e dizer: "Ei, não importa. Pedido ruim".
O julgamento não é simplesmente que o usuário cometeu um erro razoável de entrada, mas que uma solicitação HTTP é tão fora dos limites que deve ser declarada maliciosa e interrompida imediatamente.
6) Portanto, para meu dinheiro, a solicitação HTTP (MÉTODO, URL / rota e dados) é TUDO boa ou NADA mais pode prosseguir. Um modelo robusto já tem tarefas de validação com as quais se preocupar, mas um bom pastor de recursos diz: "Meu caminho, ou o caminho mais alto. Seja correto, ou nem venha".
É o seu programa, no entanto. "Há mais de uma maneira de fazer isso". Algumas formas custam mais tempo e dinheiro do que outras. A validação dos dados da solicitação HTTP posteriormente (no modelo) deve custar mais ao longo da vida útil de um aplicativo (especialmente se estiver aumentando ou diminuindo).
Se seus validadores forem modulares, a validação da entrada básica * de solicitação HTTP ** no controlador não deve ser um problema. Basta usar uma classe Validator estrategizada, onde os validadores às vezes também são compostos por validadores especializados (email, telefone, token de formulário, captcha, ...).
Alguns vêem isso completamente errado, mas o HTTP estava em sua infância quando o Gang of Four escreveu Design Patterns: Elements of Re-usable Oriented Object Oriented .
==================================================== ========================
Agora, no que se refere à validação normal de entrada do usuário (depois que a solicitação HTTP for considerada válida), ela está atualizando a visualização quando o usuário faz uma bagunça que você precisa pensar! Esse tipo de validação de entrada do usuário deve ocorrer no modelo.
Você não tem garantia de JavaScript no front-end. Isso significa que você não tem como garantir a atualização assíncrona da interface do usuário do seu aplicativo com status de erro. O verdadeiro aprimoramento progressivo também abrangeria o caso de uso síncrono.
Contabilizar o caso de uso síncrono é uma arte que está se perdendo cada vez mais, porque algumas pessoas não desejam passar pelo tempo e pelos problemas de rastrear o estado de todos os seus truques de interface do usuário (mostrar / ocultar controles, desativar / ativar controles , indicações de erro, mensagens de erro) no back-end (geralmente acompanhando o estado nas matrizes).
Atualização : no diagrama, eu digo que o View
deve fazer referência a Model
. Não. Você deve passar os dados View
do Model
para preservar o acoplamento solto.