Al minimo, la convalida della logica aziendale dovrebbe andare all'interno del Controller per il framework che stai utilizzando. Se la logica di convalida è portatile, anche la creazione di un modulo di convalida separato, chiamato dal Controller, andrebbe bene.
In generale, posiziona la logica di validazione il più vicino possibile al livello che influenza. Allo stesso modo, convalidare gli elementi al livello più appropriato (appropriato definito da ciò che è interessato). Il concetto è correlato all'incapsulamento e ai principi SOLID . L'obiettivo è quello di consentire la modifica dei singoli componenti in base alle esigenze, oltre a rendere più semplice la logica di convalida.
Per essere un po 'più chiari, se esiste una logica di convalida per proteggere il database da modifiche errate, tale logica deve essere collocata all'interno (o richiamata) dal Modello. Allo stesso modo, la validazione dell'input appartiene alla View.
Alcune logiche di convalida possono svolgere funzioni doppie (o triple) o sarebbero comuni tra più moduli nello stesso livello. È opportuno creare un modulo separato per quella logica. A rischio / spesa di controlli duplicati, vorrei comunque che ogni livello venisse convalidato per gli aspetti di cui è responsabile.