2011-08-16 19 views

risposta

7

È necessario eseguire una gestione personalizzata degli errori. Abbiamo implementato personalmente un'azione symfony personalizzata. Siate cauti, tuttavia, anche questa azione potrebbe innescare un'eccezione, è necessario tenerne conto.

Il seguente potrebbe essere un buon inizio. In primo luogo aggiungere un listener per l'evento, un buon posto sarebbe ProjectConfiguration.class.php:

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

Utilizzando il gestore di eventi potrebbe bastare per ciò che si vuole fare con l'eccezione, per esempio, se si desidera solo per posta una traccia dello stack per l'amministratore. Volevamo inoltrare un'azione personalizzata per visualizzare ed elaborare un modulo di feedback. Il nostro gestore di eventi sembrava qualcosa di simile:

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); 
    } 
} 

È ora possibile configurare il modulo e l'azione di trasmettere alla su un'eccezione in settings.yml

all: 
    .actions: 
    error_500_module:  error 
    error_500_action:  error500 

Nella stessa azione ora si può fare quello che voglio con l'eccezione, ad es. visualizza il modulo di feedback per contattare l'amministratore. È possibile ottenere l'eccezione stessa utilizzando $ request-> getParameter ('exception')

+1

+1 Grazie mille! Il nostro sistema supporta la tematizzazione e senza di essa non saremmo stati in grado di supportare la tematizzazione di errori di 500 pagine. Molto apprezzato. – flu

+0

Grazie per la tua risposta! La connessione della tua funzione personalizzata a 'application.throw_exception' * sovrascrive il comportamento predefinito di symfony su quell'evento? Se sì, posso impedirlo con la chiamata 'self :: parent()' all'interno della funzione personalizzata? Vorrei solo aggiungere * alcune funzionalità .. – Tapper

+1

@Tapper dovresti essere in grado di farlo modificando il valore di ritorno, prova invece $ event-> setReturnValue (false) – Gerry

0

Ho trovato un altro trucco per farlo: sfContext può essere utilizzato per passare il messaggio di eccezione a error.html.php ma la funzione personalizzata deve essere utilizzata per lanciare un'eccezione Per esempio:

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

rispetto al posto della usando throw new sfException('some message') dovreste usare myToolkit::throwException('some message')

Per visualizzare il messaggio in error.html.php uso <?php echo sfContext::getInstance()->get('error_msg') ?>

1

Credo di avere trovato una risposta molto più semplice. Su Symfony 1.4 $message non è infatti definito, ma $exception è (contiene l'oggetto eccezione).

Quindi basta eco $exception->message.

Et voilà!

Problemi correlati