MVC Pattern - Come ottenere errori dal modello al controller?

5

Dire che ho una tipica configurazione MVC. Il controller passa qualche input al modello e gli chiede di fare qualcosa con esso. Ma la validazione dei dati fallisce, o c'è qualche altro problema. Qual è il modo migliore per riportare questi errori al controller, che li passerà quindi alla vista per essere visualizzati all'utente?

Al momento, ho solo una matrice errors nel mio modello. Quando si verificano errori, aggiungo semplicemente i messaggi di errore a questo array e return false al controller, quindi sa che si sono verificati degli errori. E nel controller, faccio questo:

boolean result = model.process( input );

if (! result)
{
   view.displayErrors( model.getErrors() );
   return;
}
else
   view.displaySuccess();

C'è un modo migliore di gestirlo?

    
posta Click Upvote 01.02.2013 - 23:26
fonte

1 risposta

6

Quindi quello che stai suggerendo / che stai facendo attualmente è un metodo, ed è certamente un modo valido per raccogliere ulteriori informazioni sui messaggi di errore.

È un approccio abbastanza leggero - il chiamante ottiene un successo | messaggio di errore e poi spetta al chiamante scavare più a fondo per ulteriori informazioni se così ti interessa. Il rovescio della medaglia è ciò a cui hai alluso con i commenti: cosa succede se ci sono più problemi nella convalida?

Non sarebbe troppo difficile estendere questo approccio in modo che il chiamante esegua il ciclo su una chiamata di GetErrorDetails() finché quel metodo non restituisce un indicatore di "non più errori".

Un altro problema potenziale con questo approccio è l'assunto implicito che il chiamante è nella posizione migliore per gestire qualsiasi messaggio di errore possa essere. Dato che stai usando MVC, il controller non è sempre il miglior livello per risolvere quel problema. Gli errori di convalida devono essere riportati alla vista in modo che l'utente possa risolvere il problema. Non mi sto concentrando su questo aspetto poiché ci sono alcuni contro-argomenti validi per indicare che il Controller potrebbe / dovrebbe indicare l'errore. La discussione non è il punto della tua domanda.

Altertnative 1
In alternativa, considera la possibilità di creare un oggetto in piena regola con cui restituire gli errori. Invece del valore booleano che stai attualmente restituendo, restituirai l'oggetto error.

Ovviamente, l'oggetto errore dovrà avere un valore per indicare il successo | fallimento | successo parziale | qualunque cosa. Il vantaggio è che ora puoi aggiungere una raccolta di errori all'interno dell'oggetto stesso.

Ecco alcuni pseudo-codice per darti un'idea di ciò che sto suggerendo.

ErrorParent()
{
  bool success;
  List errorMsgs;
}

ErrorMessages()
{
  string message;
  int  severity;
  List callstack;
}

Il chiamante deve lavorare un po 'più difficile per determinare il successo, ma è un altrettanto semplice controllo ErrorParent.success rispetto a un controllo success . Sì, sì, conosco i problemi di digitare alcuni caratteri in più ...

Se il chiamante si preoccupa degli errori, allora può iterare sulla raccolta ErrorParent.errorMsgs e vedere cosa è andato storto. Se al chiamante non interessa degli errori, allora può passare l'oggetto errore a un gestore di errori e lasciare che il gestore faccia tutto il lavoro.

Alternativa 2 Invece di restituire un bool per successo / errore, è possibile restituire un valore numerico. Il valore numerico indica il numero di convalide non riuscite. Il controller può passare quell'errore numerico al gestore di errori "migliore" per quella situazione, quindi il gestore degli errori si sovrappone al metodo GetErrorDetails() .

    
risposta data 02.02.2013 - 18:40
fonte