Convalida voti polimorfi - Controller o Modello?

1

Ho una domanda perché non voglio fare qualcosa di sbagliato.

Ho una relazione polimorfica chiamata voti. Bene, voglio risparmiare voti, ma ho bisogno di convalidare se un utente ha già votato. Ma anche se, in alcuni casi, un utente può votare più volte. Dipende dal tipo (come detto, relazione polimorfica). Ho impostato questi dati in un file di configurazione.

Ora, dove dovrei convalidare i voti? Pensavo di poterlo fare nel modello con un metodo statico, ma poi avrei recuperato i file di configurazione nel modello e dovrei anche restituire più errori. Qualcosa come "hai già votato" o "puoi votare di nuovo in 1 ora" .

Lo farei con qualche tipo di codice di errore che passerei al controller e poi alla vista per informare l'utente. Ma mi sembra sbagliato.

Quale sarebbe il modo giusto per farlo?

    
posta sleepless 14.02.2015 - 19:46
fonte

1 risposta

1

Penso che dovresti convalidare i tuoi modelli in ... validatori di modelli;)

Nella mia architettura attuale ogni modello ha una classe di validatore associata, che contiene una logica di validazione. (Anche i controllori hanno i validatori, ma non è questo il punto). Questo perché la logica di convalida a volte può essere abbastanza complessa, specialmente quando i modelli ricevono stati.

Per convalidare un modello, passo il risultato di $ model- > getAttributes () a un validatore. La parte, responsabile della creazione di un validatore e del suo superamento, ora fa parte della mia classe BaseModel personalizzata.

L'ho configurato in modo che le esecuzioni di validazione avvengano quando il modello viene salvato. Se il modello non è valido, si verifica un'eccezione. Pertanto, il controller o il servizio, salvando il modello, sono responsabili della sua convalida.

Il risultato della convalida è vuoto quando la convalida ha esito positivo o un hash di errori ('fieldName1' = > ErrorsArray1). ErrorsArray è un MessageBag standard di Laravel, con il quale è facile rendere gli errori all'utente.

Quindi, per modellare / controllare non importa se l'Utente non può votare affatto, o sarà in grado di votare di nuovo in 1 ora. Il validatore del modello crea un messaggio di errore (cannot_vote o cannot_vote_tmp) e lo invia solo al controllore, che lo passa alla vista. Visualizza traduce il messaggio, se necessario, e lo presenta all'utente.

Attualmente gli errori vengono enumerati e presentati all'utente utilizzando un semplice elenco accanto al campo di input a cui è correlato. Ma questa logica può essere estesa. Se diventa abbastanza complesso, puoi posizionarne un po 'in un ViewComposer, che prenderà degli errori dal controller, calcolerà alcuni stati da loro e passerà questo stato in una vista liberandola da calcoli complessi.

    
risposta data 05.03.2015 - 14:29
fonte

Leggi altre domande sui tag