Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Code Igniter: gestione degli errori PHP

Code Igniter: scopriamo le funzioni offerte dal framework PHP per la gestione, la personalizzazione, la registrazione degli errori.
Code Igniter: scopriamo le funzioni offerte dal framework PHP per la gestione, la personalizzazione, la registrazione degli errori.
Link copiato negli appunti

Soluzioni e impostazione di default

Con Code Igniter è possibile configurare e personalizzare in modo semplice il sistema di gestione degli errori (Error Handling).

Di default Code Igniter è settato in modo da mostrare tutti gli errori PHP, dato che la funzione error_reporting è collocata all'inizio del file principale index.php. E' importante notare che anche disattivando l'error_reporting i file di log contenenti i messaggi di errore continueranno ad essere scritti.

A differenza di altri Framework PHP, Code Igniter utilizza esclusivamente funzioni procedurali per gestire gli errori. Un vantaggio di questo approccio è il fatto che i messaggi possono essere prodotti senza preoccuparsi dello scope delle classi/oggetti.

Il Framework restituisce uno status code ogniqualvolta il codice richiama la funzione exit. Lo status code è separato dallo status code HTTP, servendo come notice per altri processi che controllano se lo script viene eseguito correttamente, o se viene incontrato qualche problema che causa l'uscita dallo stesso. I valori sono dichiarati nel file application/config/constants.php.

Mostrare gli errori

Per l'analisi relativa alla visualizzazione degli errori abbiamo a disposizione 2 funzioni dall'aspetto procedurale: show_error e show_404. I file che costituiscono i template di errore sono delle View sul percorso application/views/errors/html/ o, nel caso della CLI, application/views/errors/cli/.

La funzione show_error richiama dunque una View (percorso application/views/errors/html/error_general.php o application/views/errors/cli/error_general.php) a cui verranno passati 2 parametri che identificano il messaggio di errore e l'intestazione (utile alla comprensione dell'errore e per il layout) ed un terzo parametro relativo allo status code da generare. La funzione show_error accetta dunque 3 parametri:

Parametro Descrizione
$message Il testo del messaggio da stampare nel file View di errore.
$status_code Responso HTTP.
$message_title Un titolo di intestazione relativo all'errore. Di default impostato su "An Error Was Encountered".

Se viene fornito il parametro $status_code lo script produrrà il responso HTTP insieme all'errore. Se viene passato un valore inferiore a 100, lo status code verrà settato a 500, mentre lo status code della funzione exit verrà settato su $status_code + EXIT__AUTO_MIN. Se il valore prodotto è superiore a EXIT__AUTO_MAX, o se $status_code è maggiore o uguale a 100, lo status code di uscita sarà impostato ad EXIT_ERROR. I valori relativi a queste costanti sono presenti nel file application/config/constants.php.

show_404 consente, in modo simile a show_error, di gestire gli errori 404. I percorsi per le View di template di errore sono collocate rispettivamente in application/views/errors/html/error_404.php e application/views/errors/cli/error_404.php.

In questo caso la stringa passata è relativa al percorso del file non trovato, mentre lo status code di uscita viene settato su EXIT_UNKNOWN_FILE. Code Igniter genera automaticamente errori di tipo 404 nel caso in cui i Controller chiamati non vengono trovati.

E' possibile provare questa funzionalità fin da subito richiamando un URL che non sia relativo a nessun Controller o a nessuna path definita nell'URI Routing. Il logging scatta automaticamente ad ogni chiamata di show_404 a meno che non venga passato FALSE come secondo parametro.

Loggare gli errori

Con log_message possiamo registrare gli errori prodotti dall'applicazione in file di testo, oltre che messaggi di vario genere. Come primo parametro occorre passare una stringa che identifica il tipo di messaggio, tra "debug", "error" o "info". Come secondo parametro, avremo il testo vero e proprio del messaggio. Ecco un semplice esempio di logging:

if ($myVariable == FALSE) {
  log_message('error', 'Testo dell\'errore.');
}
else {
  log_message('debug', 'Testo di debug');
}
log_message('info', 'Log di un\'informazione.');

Come anticipato, esistono 3 tipologie di messaggi:

Messaggio Descrizione
Error Errori veri e propri, come gli errori PHP.
Debug Messaggi di debug, come una sorta di console log.
Info Messaggi di informazione generici, con priorità inferiore ai primi due, utili a fornire informazioni generali relative all'applicazione.

Per poter utilizzare correttamente la funzione log_message, la directory application/logs/ deve essere scrivibile. In application/config/config.php è possibile impostare quali tipologie di messaggio consentire e quali escludere. Settando a 0 l'opzione il logging verrà disabilitato.

Gestione personalizzata

Ovviamente è possibile impostare il proprio sistema di gestione degli errori personalizzato, se si ha dimestichezza con PHP e con le classi. Ad esempio, nel caso degli errori 404 è possibile creare un proprio Controller che gestisca tutte le chiamate ad errori di pagine non trovate, anche limitando i segmenti a valori preimpostati. Nella seguente demo un semplice Controller chiamato ad esempio Custom404 verrà richiamato in caso di errore, per produrre un template consono alla nostra applicazione:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Custom404 extends CI_Controller {
    public function __construct() {
        parent::__construct();
    } 
    public function index() {
        $this->load->helper(array('url', 'rd-url'));
        $this->output->set_status_header('404');
        header('Location: ' . url('page/error404'));
    }
}
?>

A questo punto, tramite l'impostazione di configurazione routes chiamata $route['404_override'], possiamo impostare il nome del Controller che verrà richiamato nel caso in cui venga generato un errore 404: $route['404_override'] = 'Custom404'; sovrascrivendo il comportamento di default di Code Igniter.

Ti consigliamo anche