2010-05-26 14 views
5

Esiste una buona pratica quando si tratta di inserire la funzionalità di registrazione in un'applicazione MVC, ad esempio un'applicazione Zend Framework (Zend_Log)? Devo inserire la registrazione nel controller o nel modello? O in entrambi?Registrazione in MVC (Zend Framework)

Se in entrambi, dovrebbero avere lo stesso registratore o uno separato?

risposta

8

seguire il principio Information Expert nelle linee guida GRASP per la progettazione orientata agli oggetti:

... posizionare una responsabilità nelle classi con la maggior parte delle informazioni necessarie per realizzarlo.

Così si scriverebbe al registro dalla classe che contiene i dati che è necessario registrare. Se l'evento che si desidera registrare si riferisce al lavoro del modello, quindi scrivere nel registro nel modello. Se l'evento vuole accedere si riferisce al lavoro del controller, quindi scrivere nel registro nel controller.

Creare un'uscita di registro per un'app. Altrimenti dovrai cercare tra molti file di log per trovare qualsiasi informazione diagnostica! È possibile memorizzare un oggetto registro nel numero Zend_Registry in modo da poter richiamare il registro da qualsiasi classe nell'app.


Re tuoi commenti:

Meglio semplicemente falliscono con grazia, se il registratore non si trova sotto la chiave di registro previsto. Per errore, intendo dire che si genera un errore nello stdout (alla pagina Web) o stderr (nel log del server httpd), oppure si genera un'eccezione e si lascia che l'app la gestisca.

Per quanto riguarda le dipendenze, questo non è un problema. Ogni volta che una classe usa un'altra classe hai un tipo di dipendenza simile. Vedere lo schema di progettazione Registry.

+0

Ma con il logger estratto dal registro, il modello ha una nuova dipendenza "nascosta". Se utilizzo il modello in un'altra app, magari senza registrazione o memorizzato in una chiave diversa, tenta di ottenere il log del log. Quindi, tutti i miei modelli dovrebbero sottoclasse un modello base che contenga metodi come log(), setLogger(), getLogger()? O è solo eccessivo? –

+0

Molto utile, molte grazie. ;-) –

6

Accettando con Bill Karwin's comment, vorrei anche utilizzare un singolo output di registro ma anche sfruttare la possibilità di filter errors based on priority (ad esempio, c'è anche un logger firebug che potrebbe essere configurato con facilità).

Nella nostra app principale, abbiamo ottenuto un db-writer (che è trasformato in un feed RSS in un semplice back-end di pagina) che viene anche utilizzato come log principale ed e-mail per errori critici. Molto utile per dati ordinabili e ricavarne statistiche.