Symfony2 Mostrar un mensaje de error cuando ocurre una exception en el controlador

379 views
Skip to first unread message

Edison Quispillo

unread,
Jul 17, 2014, 7:09:31 PM7/17/14
to symfo...@googlegroups.com
 Buenas amigos,
Necesito que me salga un mensaje de error como un alert o como cualquier mensaje que entienda el usuario, cuando mi $entity no se ingrese a mi base de datos..
De hecho si me sale un mensaje de error

SQLSTATE[23505]: Unique violation: 7 ERROR: duplicate key value violates unique constraint "fk_periodicidad_producto"
DETAIL: Key (programacion_producto_id, periodicidad_id)=(9, 3) already exists.


Pero quiero que sea mas funcional, esto vi en un tutorial y es lo que he tradato de hacer pero no me sale

use Symfony\Component\Form\FormError;
....
..........
...

$em->persist($entity);
 try {
                        $em->flush();   ///Aqui me sale el error
                        return $this->redirect($this->generateUrl('ejecucionproducto_show', array('id' => $entity->getId())));
       }
    catch (\Doctrine\DBAL\DBALException $e){
                   
                    $this->get('session')->getFlashBag()->add('errordelete', "No se puede ingresar, clave compuesta Duplicada.");
                    return $this->redirect($this->getRequest()->getRequestUri());
                   
     }

Manuel Aguirre

unread,
Jul 18, 2014, 9:05:56 AM7/18/14
to symfo...@googlegroups.com
Buenas, para ese caso puedes usar las validaciones del fw.

Hay una que es UniqueEntity, y allí puedes indicar que algunos campos (o combinaciones de campos) no pueden repetirse, y crear un mensaje para cuando pase.


--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

---
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony-es+...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.



--

Manuel Aguirre.


manuel_j555 | Desarrollador de Software | Optime Consulting | twitter | github | Sitio web


A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos de leer manuales.

Tito Canteros

unread,
Jul 23, 2014, 2:23:43 AM7/23/14
to symfo...@googlegroups.com

Felix

unread,
Jul 23, 2014, 9:30:53 AM7/23/14
to symfo...@googlegroups.com
En el archivo twig tienes que poner:
    {% for flashMessage in app.session.flashbag.get('errordelete') %}
        <div class="alert-error">
            {{ flashMessage }}
        </div>
    {% endfor %}

Si lo que quieres es mostrarlo dentro del formulario:

    catch (\Doctrine\DBAL\DBALException $e){
                   //$this->get('session')->getFlashBag()->add('errordelete', "No se puede ingresar, clave compuesta Duplicada.");
                   $form->addError(new FormError("No se puede ingresar, clave compuesta Duplicada."));

                   return $this->redirect($this->getRequest()->getRequestUri());                   
     }
En versiones inferiores a la 2.3 se usaba una línea diferente a '\Doctrine\DBAL\DBALException', no me acuerdo cual. Si no pasa por el catch en tu caso puede ser que tengas que buscar cual es la correcta.
El catch de esta forma está incompleto, considera todos los errores como si fuera la llave duplicada, debes encontrar el error que te hace falta y relanzar los demás. Algo así como:       
        const ER_DUP_ENTRY = 1062;         //Busca cual es tu error
        $errorCode = 23000;                         //database_driver = pdo_mysql, busca cual es para la base de datos que estas usando
        if ($e->getCode() == 0)
        {
            if ($e->getPrevious()->getCode() == $errorCode)
            {
                $x = $e->getPrevious()->errorInfo;
                if ($x[1] == ER_DUP_ENTRY)
                {
                      $form->addError(new FormError("No se puede ingresar, clave compuesta Duplicada."));

                       return $this->redirect($this->getRequest()->getRequestUri());
                 }
                else
                {
                      throw $e;
                }
            }
            else
            {
                throw $e;
            }
        }
        else
        {
            throw $e;
        }
Esto es solo una guía, no es para seguir al pie de la letra.
Reply all
Reply to author
Forward
0 new messages