2011-08-16 17 views

Respuesta

7

Tendrá que hacer un manejo de error personalizado. Implementamos una acción de avance a una personalizada de Symfony. Sin embargo, sea prudente, esta acción en sí podría estar desencadenando una excepción, debe tener eso en cuenta.

Lo siguiente puede ser un buen comienzo. Primero se debe agregar un detector para el evento, un buen lugar sería ProjectConfiguration.class.php:

$this->dispatcher->connect('application.throw_exception', array('MyClass', 'handleException')); 

Utilizando el controlador de eventos podría ser suficiente para lo que quiere hacer con la excepción, por ejemplo, si sólo desea enviar por correo un seguimiento de la pila al administrador. Queríamos reenviar a una acción personalizada para mostrar y procesar un formulario de comentarios. Nuestro gestor de eventos se veía algo como esto:

class MyClass { 
    public static function handleException(sfEvent $event) { 
    $moduleName = sfConfig::get('sf_error_500_module', 'error'); 
    $actionName = sfConfig::get('sf_error_500_action', 'error500'); 
    sfContext::getInstance()->getRequest()->addRequestParameters(array('exception' => $event->getSubject())); 
    $event->setReturnValue(true); 
    sfContext::getInstance()->getController()->forward($moduleName, $actionName); 
    } 
} 

Ahora puede configurar el módulo y la acción de remitir a una excepción en el archivo settings.yml

all: 
    .actions: 
    error_500_module:  error 
    error_500_action:  error500 

En la misma acción que ahora puede hacer lo que querer con la excepción, ej. muestre el formulario de comentarios para contactar al administrador. Puede obtener la excepción usando $ request-> getParameter ('exception')

+1

+1 ¡Muchas gracias! Nuestro sistema es compatible con la creación de temas y sin esto no habríamos sido capaces de admitir la ejecución de errores de 500 páginas también. Muy apreciado. – flu

+0

¡Gracias por su respuesta! ¿La conexión de su función personalizada a 'application.throw_exception' * sobrescribe el comportamiento predeterminado de * symfony en ese evento? En caso afirmativo, ¿puedo evitarlo llamando a 'self :: parent()' dentro de la función personalizada? Solo me gustaría * agregar * alguna funcionalidad .. – Tapper

+1

@Tapper deberías ser capaz de lograr eso modificando el valor de retorno, prueba $ event-> setReturnValue (false) en su lugar – Gerry

0

He encontrado otro truco para hacer eso: sfContext se puede usar para pasar el mensaje de excepción al error.html.php pero la función personalizada debe usarse para arrojar excepción. Por ejemplo:

class myToolkit { 
    public static function throwException($message) 
    { 
     sfContext::getInstance()->set('error_msg', $message); 
     throw new sfException($message); 
    } 

de restaurantes en vez de utilizar throw new sfException('some message') se debe utilizar myToolkit::throwException('some message')

Para mostrar el mensaje en error.html.php uso <?php echo sfContext::getInstance()->get('error_msg') ?>

1

creo que he encontrado una respuesta mucho más simple. En Symfony 1.4 $message de hecho no está definido, pero $exception es (contiene el objeto de excepción).

Tan solo echo $exception->message.

Et voilà!

Cuestiones relacionadas