jueves, 31 de julio de 2014

Personalizar los estilos de los mensajes de error en PHP - debug de errores


Bienvenid@s, hoy vamos a ver como personalizar los estilos de los mensajes de error en PHP. El debug de errores es una de las partes fundamentales en la fase de desarrollo de aplicaciones con PHP, ya que estos mensajes nos permiten saber del tipo de error, el archivo y la línea donde se ha producido, es habitual ver en los frameworks este tipo de mensajes de un modo personalizado, es decir, con sus propia estructura y estilos CSS.

Hoy nosotros vamos a ver un ejemplo práctico de como personalizar los errores, vamos a realizar un supuesto en el cual tenemos un script php, que al ejecutarlo nos va a regresar un tipo de error E_NOTICE: Undefined variable, es decir, la variable no ha sido definida y no contiene ningún valor. Llamemos a este script por ejemplo: errores.php

<?php

/* Incluimos el script para personalizar los estilos de los mensajes de error en tiempo de ejecución */
require "personalizar-errores.php";

/* Esta variable no ha sido definida y regresará un error */
echo $hola;


Como podéis ver en el archivo se está requiriendo a un script llamado personalizar-errores.php, este script será el encargado de capturar y dar estilos a los mensajes de error. Código de personalizar-errores.php:

<?php

define('E_FATAL',  E_ERROR | E_USER_ERROR | E_PARSE | E_CORE_ERROR | 
        E_COMPILE_ERROR | E_RECOVERABLE_ERROR);

define('ENV', 'dev');

//Custom error handling vars
define('DISPLAY_ERRORS', TRUE);
define('ERROR_REPORTING', E_ALL | E_STRICT);
define('LOG_ERRORS', TRUE);

register_shutdown_function('shut');
set_error_handler('handler');

//Function to catch no user error handler function errors...
function shut(){

    $error = error_get_last();

    if($error && ($error['type'] & E_FATAL)){
        handler($error['type'], $error['message'], $error['file'], $error['line']);
    }

}

function handler( $errno, $errstr, $errfile, $errline) {

    switch ($errno){

        case E_ERROR: // 1 //
            $typestr = 'E_ERROR'; break;
        case E_WARNING: // 2 //
            $typestr = 'E_WARNING'; break;
        case E_PARSE: // 4 //
            $typestr = 'E_PARSE'; break;
        case E_NOTICE: // 8 //
            $typestr = 'E_NOTICE'; break;
        case E_CORE_ERROR: // 16 //
            $typestr = 'E_CORE_ERROR'; break;
        case E_CORE_WARNING: // 32 //
            $typestr = 'E_CORE_WARNING'; break;
        case E_COMPILE_ERROR: // 64 //
            $typestr = 'E_COMPILE_ERROR'; break;
        case E_CORE_WARNING: // 128 //
            $typestr = 'E_COMPILE_WARNING'; break;
        case E_USER_ERROR: // 256 //
            $typestr = 'E_USER_ERROR'; break;
        case E_USER_WARNING: // 512 //
            $typestr = 'E_USER_WARNING'; break;
        case E_USER_NOTICE: // 1024 //
            $typestr = 'E_USER_NOTICE'; break;
        case E_STRICT: // 2048 //
            $typestr = 'E_STRICT'; break;
        case E_RECOVERABLE_ERROR: // 4096 //
            $typestr = 'E_RECOVERABLE_ERROR'; break;
        case E_DEPRECATED: // 8192 //
            $typestr = 'E_DEPRECATED'; break;
        case E_USER_DEPRECATED: // 16384 //
            $typestr = 'E_USER_DEPRECATED'; break;

    }
    
     $myFile = $errfile;
     $lines = file($myFile);
     $content = null;
     
     $x = 1;
     foreach($lines as $value)
     {
         if ($x == $errline)
         {
          $content = htmlspecialchars("Line " . $x . ": " . $value);
         }
         $x++;
     }
         
    $message = '<div style="background: #E6D3F6; border: 1px solid #D2B8E9; padding: 5px; font-family: sans-serif;">'
         . '<b>'.$typestr.': </b>'.$errstr.'<br>'
            . '<b>IN FILE: </b>'.$errfile.' <i>on line</i> >>> <b style="color: #FF0000; font-size: 20px; background:#FFFFFF; border-radius: 50%; padding: 5px;">'.$errline.'</b><br>'
            . '<pre style="background: #FFFFFF; padding: 10px; margin-right: 20px; border-radius: 2px; color: #000000;">'
            . ''
            . $content
            . ''
            . '</pre>'
   . '</div>'
   ;

    if(!($errno & ERROR_REPORTING))
        return;

    if(DISPLAY_ERRORS)
    printf('%s', $message);
    exit;

    //Logging error on php file error log...
    if(LOG_ERRORS)
        error_log(strip_tags($message), 0);
}

Ahora ejecutamos el script errores.php en el navegador y encontraremos el siguiente resultado:

Personalizar los estilos de los mensajes de error en PHP - debug de errores

Bien, pues ya tenemos un ejemplo de como personalizar los mensajes de error de PHP, espero que les haya gustado, saludos.


No hay comentarios: