Cómo configurar el controlador de errores personalizado en Codeigniter para errores de correo electrónico

Soy bastante nuevo en PHP y en la configuración de controladores de errores personalizados, pero tengo un código que funciona bien fuera de CI, pero no sé cómo integrarlo en un controlador de CI. Recibo un error "Mensaje: Propiedad no definida: Errores::$my_error_handler"

Mi controlador es:

<?php
class Errors extends CI_Controller {


    public function __construct()
    {
        parent::__construct();

    }

    function my_error_handler($number, $message, $file, $line, $vars)
    {
        $email = "
            <p>An error ($number) occurred on line
            <strong>$line</strong> and in the <strong>file: $file.</strong>
            <p> $message </p>";

        $email .= "<pre>" . print_r($vars, 1) . "</pre>";

        $headers = 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

        // Email the error to someone...
        error_log($email, 1, 'name@domain.com', $headers);

        // Make sure that you decide how to respond to errors (on the user's side)
        // Either echo an error message, or kill the entire project. Up to you...
        // The code below ensures that we only "die" if the error was more than
        // just a NOTICE.
        if ( ($number !== E_NOTICE) && ($number < 2048) ) {
            die("There was an error. Please try again later.");
        }
    }


    function test()
    {
        // We should use our custom function to handle errors.
        set_error_handler($this->my_error_handler);

        // Trigger an error... (var doesn't exist)
        echo $somevarthatdoesnotexist;

    }

}
?>

Si hay una mejor manera de enviar mensajes de error por correo electrónico usando CI, házmelo saber.

preguntado el 12 de junio de 12 a las 12:06

3 Respuestas

No creo que extender CI_Controller sea la forma correcta de resolver esto. En su lugar, debe extender CI_Logs para enviar un correo electrónico, siempre que se registre un error:

class MY_Log extends CI_Log {

    function MY_Log(){

        parent::__construct();

    }

    function write_log($level = 'error', $msg, $php_error = FALSE){

        $result = parent::write_log($level, $msg, $php_error);

        if ($result == TRUE && strtoupper($level) == 'ERROR') {

            $message = "An error occurred: \n\n";
            $message .= $level.' - '.date($this->_date_fmt). ' --> '.$msg."\n";

            $this->CI =& get_instance();
            $to = $this->CI->config->item('email_admin_address');
            $from_name = $this->CI->config->item('email_general_name');
            $from_address = $this->CI->config->item('email_general_address');

            $subject = 'An error has occured';
            $headers = "From: $from_name <$from_address>" . "\r\n";
            $headers .= 'Content-type: text/plain; charset=utf-8\r\n';

            mail($to, $subject, $message, $headers);

        }

        return $result;

    }

}

Guarde esta clase en application\libraries\MY_Logs.php y no olvide habilitar el registro de errores en su config.php: $config['log_threshold'] = 1;

Felicitaciones a WPStorment, a quien se le ocurrió esta idea primero.

Respondido 04 Oct 12, 08:10

He encontrado la solución.

set_error_handler(array(&$this, 'my_error_handler'));

Dado que debe decirle al controlador de errores que es un método de clase al que desea llamar (significado previsto de set_error_handler(array(&$this, ‘method’))) y no sólo una función (significado previsto de set_error_handler(‘function’))

Respondido el 13 de junio de 12 a las 12:06

Si extiende la clase de excepciones principales, podrá agregar la funcionalidad requerida dentro de eso.

Publicación en el foro de Codeigniter sobre la extensión de esa clase

Espero que esto ayude

Respondido el 12 de junio de 12 a las 13:06

Hola Michael. Sí, eso me ha indicado la dirección correcta para enviar por correo electrónico todos los errores, pero también necesito poder actualizar la base de datos si ocurre un error en un método específico de un controlador. Estoy pensando que probablemente no necesite ajustar la clase de excepciones para hacer esto. ¿Que sugieres? - Pablo Benbow

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.