2011-08-16 85 views

回答

7

你需要做一些自定義的錯誤處理。我們自己實施了自定義symfony操作。請謹慎行事,這種行爲本身也可能引發異常,您需要考慮這一點。

以下可能是一個好的開始。首先添加一個監聽事件,一個好地方是ProjectConfiguration.class.php:

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

使用事件處理程序可能足以滿足您想用異常做什麼,例如,如果你只是想郵寄一個堆棧跟蹤到管理員。我們希望轉發自定義操作來顯示和處理反饋表單。我們的事件處理程序看起來是這樣的:

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

您可以將模塊和行動立即配置到settings.yml中

all: 
    .actions: 
    error_500_module:  error 
    error_500_action:  error500 

轉發到異常在行動本身,你現在可以做任何你想要例外,例如。顯示反饋表單以聯繫管理員。你可以通過使用$ request-> getParameter('exception')來獲得異常本身

+1

+1非常感謝!我們的系統支持主題化,如果沒有這個功能,我們也不會支持錯誤500頁的主題。非常感激。 – flu

+0

感謝您的回答!將自定義函數連接到'application.throw_exception' *是否覆蓋* symfony在該事件上的默認行爲?如果是的話,我可以通過在自定義函數中調用'self :: parent()'來防止它嗎?我只是想*添加*一些功能.. – Tapper

+1

@Tapper你應該能夠通過修改返回值來實現,試試$ event-> setReturnValue(false) – Gerry

0

我發現了另一個技巧 - sfContext可以用來將異常消息傳遞給error.html.php,但是必須使用自定義函數拋出異常。例如:

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

比使用throw new sfException('some message')的insted的,你應該使用myToolkit::throwException('some message')

error.html.php使用<?php echo sfContext::getInstance()->get('error_msg') ?>

1

顯示的消息,我想我找到了一個更簡單的答案。 Symfony 1.4 $message確實沒有定義,但是$exception是(它包含異常對象)。

所以只是回聲$exception->message

等voilà!

相關問題