2010-08-24 243 views
3

在使用nusoap的symfony應用程序(這是整合肥皂工作與php/symfony的最佳方法?)之間進行信用卡付款的工作。php symfony異常處理/錯誤處理

我簡化了下面我的代碼示例。

我正在努力的是處理異常的最佳方式。下面的例子只有一個自定義異常(我的自定義異常應該在symfony的目錄結構中(lib/exception?))應該如何處理?但是當有幾種不同類型的異常處理特定錯誤時會發生什麼?擁有20個奇數例外的try/catch塊並不是很優雅。

我也不確定我應該在哪裏投擲和捕捉。我需要設置一些用戶閃爍來提醒用戶任何問題,所以我認爲捕捉應該在動作控制器中完成,而不是在處理肥皂呼叫的類中完成。

任何人都可以請告訴我哪裏可能會出錯?

我討厭凌亂的代碼/解決方案,並希望儘可能堅持DRY原則。我想我可能也會缺少一些內置於symfony中的功能,這可能對此有所幫助,但每當我搜索時,我通常會找到適用於symfony 1.2的示例,我使用的是1.4。

一些例子會很好,謝謝。

的lib/soap_payment.class.php

class SoapPayment 
{ 
    public function charge() 
    { 
    /*assume options are setup correctly for sake of example*/ 
    try 
    { 
     $this->call(); 
    } 
    catch (SoapPaymentClientFaultException $e) 
    { 
     /* should this be caught here? */ 
    } 
    } 

    private function call() 
    { 
    $this->client->call($this->options); 

    if ($this->client->hasFault()) 
    { 
     throw new SoapPaymentClientFaultException(); 
    } 
    } 
} 

應用/前端/支付/動作/的actions.class.php

class paymentActions extends sfActions 
{ 
    public function executeCreate(sfWebRequest $request) 
    { 
    /* check form is valid etc */ 

    $soap_payment = new SoapPayment(); 

    try 
    { 
     $soap_payment->charge(); 
    } 
    catch (SoapPaymentClientFaultException $e) 
    { 
     /* or throw/catch here? */ 
     $this->getUser()->setFlash('error', ...); 

     $this->getLogger()->err(...); 
    } 

    /* save form regardless, will set a flag to check if successful or not in try/catch block */ 
    } 
} 

回答

3

的Symfony的一個不怎麼出名的特點是,可以例外管理響應中發送的內容。如果您需要SOAP異常的清潔處理,如設置閃爍,等你可能會必須抓住每個異常

class SoapException extends sfException 
{ 
    public function printStackTrace() //called by sfFrontWebController when an sfException is thrown 
    { 
    $response = sfContext::getInstance()->getResponse(); 
    if (null === $response) 
    { 
     $response = new sfWebResponse(sfContext::getInstance()->getEventDispatcher()); 
     sfContext::getInstance()->setResponse($response); 
    } 

    $response->setStatusCode(5xx); 
    $response->setContent('oh noes'); //probably you want a whole template here that prints the message that was a part of the SoapException 
    } 
} 

:所以,你可以做這樣的事情。這裏的一個想法可能是創建一個通用的SoapException類,它被更具體的SoapExceptions擴展,所以你不必捕獲一堆不同的類型。上面的代碼也可能是一個有用的回退機制。

最後,是的,您應該在lib/exception中放置自定義例外。

+0

我沒有看到'lib/exception'目錄。但是,我看到一個'lib/vendor/symfony/lib/exception'目錄;這是你的意思嗎? – rlandster 2011-02-24 17:42:15

+0

@rlandster只需創建一個lib/exception'目錄。 'lib/vendor /'用於第三方庫,不應該修改。 – takteek 2011-03-05 01:10:29