簡體   English   中英

php symfony異常處理/錯誤處理

[英]php symfony exception handling/error handling

使用一個使用nusoap的symfony應用程序(這是將soap工作與php / symfony集成的最佳方法嗎?)來進行信用卡付款。

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

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

我也不確定我應該在哪里投擲和捕捉。 我需要設置一些用戶閃存來提醒用戶任何問題,所以我認為捕獲應該在操作控制器中完成,而不是在處理soap調用的類中。

誰能告訴我哪里可能出錯?

我討厭凌亂的代碼/解決方案,並希望盡可能堅持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 */
   }
}

Symfony的一個不為人知的特性是異常可以管理響應中發送的內容。 所以你可以這樣做:

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

如果您需要更清晰地處理SOAP異常,例如設置閃爍等,您可能必須捕獲每個異常。 這里的一個想法可能是創建一個通用的SoapException類,該類由更具體的SoapExceptions擴展,因此您不必捕獲一堆不同的類型。 上面的代碼也可能是一個有用的回退機制。

最后,是的,您應該在lib/exception放置自定義lib/exception

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM