обработка исключений php symfony / обработка ошибок - PullRequest
3 голосов
/ 24 августа 2010

Работа над приложением Symfony, которое использует nusoap (это лучший метод для интеграции мыльной работы с php / symfony?) Для приема платежей по кредитным картам.

Я упростил пример моего кода ниже.

То, с чем я борюсь, - лучший способ обработки исключений.В приведенном ниже примере есть только 1 пользовательское исключение (где мои пользовательские исключения должны находиться в структуре каталогов symfony? (Lib / exception?)). Но что происходит, когда есть несколько различных типов исключений, которые обрабатывают конкретную ошибку?Не очень элегантно иметь блок try / catch с 20 странными исключениями.

Я также не уверен, куда мне следует бросать и ловить.Мне нужно настроить некоторые пользовательские вспышки, чтобы предупредить пользователя о любых проблемах, поэтому я считаю, что перехват должен выполняться в контроллере действий, а не в классе, который обрабатывает вызов мыла.

Может кто-нибудь сообщить, где яможет быть не так?

Я ненавижу грязный код / ​​решения и хочу как можно больше придерживаться принципа СУХОЙ.Я думаю, что я мог бы также упустить некоторые встроенные функции 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();
    }
  }
}

apps / frontend / payment / actions / 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 */
   }
}

1 Ответ

3 голосов
/ 24 августа 2010

Одной не очень известной особенностью 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.

...