2009-10-08 2 views
8

Sto usando Kohana, ma penso che questa domanda sia più generale.Dove dovrebbe verificarsi la convalida del modulo in un progetto MVC?

Ho eseguito la convalida del modulo nel controller e fino ad ora ha funzionato bene. Ma ultimamente, ho avuto un problema.

Ho un modello di commenti e invio commenti da alcuni controller diversi. Invece di avere un validatore in ogni controller, l'ho inserito nel modello.

Ciò è grande perché

  • solo un posto per cambiare/aggiungere regole di validazione (secco)

Questo fa schifo perché

  • Io, ovviamente, bisogno di restituire un successo o il fallimento al controller e la libreria di convalida di Kohana restituisce gli errori come array. Quindi il mio ritorno simile a questa

sul successo

array('success' => true); 

ON FAIL

array('success' => false, $errors); 

non posso fare a meno di pensare questo è sbagliato. Si si sente sbagliato.

Se lo faccio nel controller, posso semplicemente fare

if ($post->validate()) { 
    doWhatever(); 
} else { 
    $this->template->formErrors = $post->errors('form_errors'); 
} 

Quale sembra migliore (per me).

C'è un modo migliore per farlo? Devo convalidare nel controller o nel metodo? Sto impazzendo?

+0

Ecco come faccio e poi controllo l'indice di successo per decidere cosa fare (non con Kohona, ma in generale.) –

risposta

4

Sinceramente non vedo niente di sbagliato con il tuo metodo, alex. Sembra che lo stai facendo correttamente. Stai seguendo il principio ASCIUTTO, che per me è solitamente il metro da misurare se sto facendo qualcosa di giusto quando si tratta di MVC.

0

Preferisco non ripetermi sui sentimenti, fare il metodo. Inoltre, l'array è utile in quanto è possibile mostrare gli errori dell'array in una vista, se lo si desidera. Non ho usato kohana, ma il metodo di validazione che ho usato in ASP.NET MVC mi fornisce un elenco simile e posso quindi mostrare all'utente che cosa è esattamente sbagliato.

0

Si dovrebbe sempre (se possibile) convalidare sul client (JS). E dal momento che può essere aggirato, si convalida anche sul server. E sì - la tua convalida in una forma riutilizzabile è una grande idea

+0

A meno che non siate troll che vogliono solo spostare la vostra risposta - date la cortesia di spiegare perché state dando -1 a questa risposta. Convalidare sul client - ha senso è molto più veloce quindi tornare al server. Ma affidarsi al solo cliente è pericoloso poiché può essere facilmente aggirato. Da qui la mia risposta – Bostone

+0

Penso che dovresti mettere più impegno nella risposta, in primo luogo, non solo nel commento. Solo per essere un giudice, ho compenetrato quel bastardo. :) – pestaa

+0

Grazie :) Non tutte le mie risposte sono così brevi. Stavo solo cercando di aggiungere la mia voce al coro – Bostone

2

Modelli grassi. Piccoli controller. È così che l'ho sempre fatto. La convalida per me è a livello di dati. Il livello dati (per me, almeno) è il modello. Di solito uso CakePHP come framework MVC ... Forse è per questo che la mia convalida è alla modella. È il modo di CakePHP.

0

Faccio convalida anche nel modello. La maggior parte delle librerie di modelli come ORM, Auto_Modeler ecc. Supportano anche la validazione. BTW è più veloce se chiedi sul canale #kohana su FreeNode (irc.freenode.net).Noi (di solito) non mordiamo :)

6

Non penso che tutte le regole di validazione possano andare all'interno del modello. La convalida riguarda esclusivamente il modulo (o l'API). Il fatto è che quando si convalidano i dati, la maggior parte delle cose dipende dal contesto .

Ad esempio, si tratta di un utente che ha effettuato l'accesso prendendo l'azione? Non accoppiare il livello di autenticazione con il modello che viene convalidato. Quindi, tutti i controlli devono andare all'interno del controller. Il modello è indipendente dal contesto; il modulo "appartiene" al controller ed è sensibile al contesto.

Penso che avere per-forma regole di convalida piùbase controlli a modello per i dati di ben formato è la strada da percorrere. Se stai chiamando Auth :: instance() o Session :: instance() all'interno della funzione validate() del tuo modello, allora stai sbagliando.