Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Cómo personalizar el error de conexión de Doctrine con la base de datos

8 de marzo de 2016

Estoy trabajando en un proyecto y la verdad me he trabado un poco en esta cuestión.


Respuestas

#1

Hola @jdvellon,

Pues si es en Symfony tienes que personalizar las páginas de error puedes tomar como guía este enlace.

Tendrías que ponerle algo mas de lógica para capturar el código de error de la conexión y mostrarlo.

Espero sea de ayuda.

Saludos

@miguelplazasr

9 marzo 2016, 0:32
#2

Amigo es que lo que no quiero es ponerme a capturalo cada vez que hago una petición en un controlador, quiero que sea centralizado. Más bien lo que quiero lograr es que cuando el sistema detecte que no hay conexión me muestre un mensaje "No hay conexión con la base de datos".

Me imagino que sea algo como un listener en donde capture el objeto response y si es el error de conexión de Doctrine modifico la respuesta al cliente. Pero todavía no he encontrado documentación que lo explique.

Su aporte es bienvenido. Gracias.

@jdvellon

9 marzo 2016, 15:29
#3

Además de la solución que te dio @miguelplazasr, puedes usar esta otra idea para crear un listener en la aplicación y mostrar un mensaje especial si se produce una excepción de tipo PDOException.

@javiereguiluz

9 marzo 2016, 15:33
#4

Ya di con la solución, muchísimas gracias. No me puedo ir sin antes comentarle mi versión, a lo mejor alguien tambien la necesita. La cosa estaba cerca de la solución que me indicabas en StackOverflow; de hecho era muy certera.

Lo primero es crear un servicio. Ej:

services:
    kernel.listener.doctrine_conexion:
        class: AppBundle\Listener\DoctrineConexion
        tags:
           - { name: kernel.event_listener, event: kernel.exception, method: onPdoException }

Luego en la clase indicada se coloca el siguiente código:

namespace AppBundle\Listener;
 
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Doctrine\DBAL\Exception\ConnectionException;
 
class DoctrineConexion
{
    public function onPdoException(GetResponseForExceptionEvent $event)
    {
         $exception = $event->getException();
         if ($exception instanceof ConnectionException) {
             //ejecuto algo en caso de error
         }
    }
}

Consideraciones:

La clase que eleva el error de conexión es ConnectionException no PDOException como indica el de StackOverflow (a lo mejor antes se llamaba así, no se, yo uso symfony2.8). Otro error que el comete es que no pone el use de PDOException. Una forma sencilla de saber cual es la instancia de $event y fue la forma que yo utilize es simplemente echo get_class($exception); y este te dice cual es la instancia de la clase. En este caso devolvió: Doctrine\DBAL\Exception\ConnectionException

Muchas gracias por sus ayudas. Gracias Javier. Espero que este post también ayude a otras personas.

@jdvellon

10 marzo 2016, 22:39
#5

@jdvellon ¡muchas gracias por la respuesta tan detallada! Me gustaría añadir un pequeño comentario. En tu código estás comprobado si el error es de tipo ConnectionException. Eso es correcto, pero a lo mejor es insuficiente.

Si te fijas en el código fuente de ConnectionException, verás que a su vez extiende de otra clase Doctrine\DBAL\DBALException. A lo mejor te interesa atrapar esa otra excepción para mostrar mensajes de error propios no solo cuando no hay conexión a la base de datos sino también cuando se producen otros errores relacionados con la base de datos.

@javiereguiluz

11 marzo 2016, 9:53