4.3 Gestione degli errori
Nel caso di errore irreversibile nell' applicazione, è uso comune bloccare l'esecuzione e visualizzare una pagina di errore per l'utente. Per evitare di scrivere il codice di gestione dell'errore in ogni componente e controller, puoi usare il metodo fornito appositamente:
$this->cakeError(string $errorType [, array $parameters]);
Richiamando questo metodo verrà visualizzata una pagina di errore per l'utente e si stopperà ogni ulteriore esecuzione della applicazione.
parameters deve essere una array di stringhe. Se l'array contiente oggetti (incluse le Exception), essi saranno castati a stringhe.
CakePHP pre-definisce un insieme di tipi di errore, ma al momento, molti sono utili solo al framework stesso. Uno molto utile allo sviluppatore è l'ottimo vecchio errore 404. Esso può essere richiamato senza parametri, come segue:
$this->cakeError('error404');
$this->cakeError('error404');
Oppure alternativamente, puoi fare in modo che la pagina che riporta l'errore sia una specifica URL passata come parametro url:
$this->cakeError('error404', array('url' => 'directory/altra.url'));
$this->cakeError('error404', array('url' => 'directory/altra.url'));
Tutto ciò diventa utile quando si estende il gestore degli errori con dei tipi di errore auto definiti. I gestori degli errori sono largamente usati come azioni di controller; solitamente imposterai ( set()) ogni parametro passato per essere disponibile alla vista per poi visualizzare un file di vista contenuto nella tua directory degli errori, app/views/errors.
Crea un file app/app_error.php con la seguente definizione
<?php
class AppError extends ErrorHandler {
}
?>
<?phpclass AppError extends ErrorHandler {}?>
I gestori dei nuovi tipi di errore possono essere implementati tramite metodi definiti in questa classe. Semplicemente crea un nuovo metodo con il nome che vuoi usare per il tipo di errore.
Pensiamo di avere una applicazione che scrive un certo numero di file sul disco e che sia appropriato riportare eventuali errori all'utente. Per fare ciò non vogliamo aggiungere codice in varie parti della nostra applicazione, quindi è proprio il caso di creare un nuovo tipo di errore.
Aggiungi un nuovo metodo alla tua classe AppError. Prenderemo un parametro, chiamato file, che rappresenta il percorso al file la cui scrittura ha fallito.
function cannotWriteFile($params) {
$this->controller->set('file', $params['file']);
$this->_outputMessage('cannot_write_file');
}
function cannotWriteFile($params) {$this->controller->set('file', $params['file']);$this->_outputMessage('cannot_write_file');}
Crea la vista in app/views/errors/cannot_write_file.ctp
<h2>Impossibile scrivere il file</h2> <p>Non è stato possibile scrivere il file <?php echo $file ?> sul disco.</p>
<h2>Impossibile scrivere il file</h2><p>Non è stato possibile scrivere il file <?php echo $file ?> sul disco.</p>
e lancia l'errore nel tuo controller/component
$this->cakeError('cannotWriteFile', array('file'=>'somefilename'));
$this->cakeError('cannotWriteFile', array('file'=>'somefilename'));
L'implementazione di default di $this->_outputMessage(<view-filename>) visualizza solo la vista situata in views/errors/<view-filename>.ctp. Se vuoi sovrascrivere questo comportamento, puoi ridefinire _outputMessage($template) nella tua classe AppError.


























