2012-07-15 11 views
10

No estoy seguro de por qué no capturo excepciones de Swiftmailer en mi controlador. ¿Qué estoy haciendo mal o me falta?Catch swiftmailer excepción en el controlador Symfony2 dev env

En un controlador que tengo:

try { 
    $this->get('mailer')->send($email); 
} 
catch (\Swift_TransportException $e) { 
    $result = array(
     false, 
     'There was a problem sending email: ' . $e->getMessage() 
    ); 
} 

Parece ser atrapado por Symfony antes de que llegue a mi código, así que en vez de ser capaz de manejar el error yo tengo la página estándar 500 con Swift_TransportException: Connection could not be established

Si no se puede enviar el correo electrónico, no es necesario detener la aplicación, ya que el correo electrónico no es crítico. Solo quiero emitir un aviso.

Tal vez haya una manera de desactivar la captura de Symfonys de ciertas excepciones o para ciertos Controladores?

+0

Creo que puede hacerlo anulando el controlador Twig Exception. Aunque no estoy 100% seguro. Ver mi respuesta a continuación. – codecowboy

Respuesta

3

Cuando lo hace $this->container->get("mailer")->send($email);, el mensaje de correo electrónico no se envía en ese momento si tiene activado el spooling. Ver http://symfony.com/doc/current/cookbook/email/spool.html

Si tiene la configuración predeterminada de spool: { type: memory }, se lanzará el \Swift_TransportException durante la fase de terminación del kernel, después de que su controlador haya salido. Una forma de evitar esto es desactivar el spooling (pero es posible que los usuarios tengan que esperar mientras se envía el correo electrónico), o puede hacer que su propio eventlistener maneje la excepción. http://symfony.com/doc/current/cookbook/service_container/event_listener.html

0

Usted puede tratar de anular el manejador de excepción en la ramita config.yml:

twig: 
    debug:   %kernel.debug% 
    strict_variables: %kernel.debug% 
    exception_controller: MyBundleName:Exception:show 

A continuación, crea una clase de excepción que se extiende:

Symfony \ Bundle \ TwigBundle \ Controller \ ExceptionController

Lea el código fuente de ese archivo y luego anule los métodos para cambiar qué plantilla se representa cuando el tipo de Excepción es Swift_TransportException

Puede hacerlo mediante el establecimiento de una variable de clase en showAction() y pasando a findTemplate()

showAction:

$ this-> exceptionClassName = $ excepcionalmente> getClass();

findTemplate:

if (!$debug && $this->exceptionClassName == 'MyBundle\Exception\GenericNotFoundException') { 

      return 'BundleName:Exception:generic404.html.twig'; 
     } 

Para obtener más información, recomiendo el KNPUniversity Symfony Screencasts.

Cuestiones relacionadas