2010-08-24 5 views
3

Travailler sur une application symfony utilisant nusoap (est-ce la meilleure méthode pour intégrer le travail du savon avec php/symfony?) Pour accepter les paiements par carte de crédit.php symfony gestion des exceptions/erreurs

J'ai simplifié un exemple de mon code ci-dessous.

Ce que je suis aux prises avec est la meilleure façon de gérer les exceptions. L'exemple ci-dessous ne comporte qu'une seule exception personnalisée (où mes exceptions personnalisées doivent-elles résider dans la structure de symfony?) (Lib/exception?)) Mais que se passe-t-il lorsque plusieurs types d'exceptions gèrent une erreur spécifique? Ce n'est pas très élégant d'avoir un bloc try/catch avec 20 exceptions impaires.

Je ne suis pas sûr non plus d'où je devrais lancer et attraper. J'ai besoin de définir des flashs d'utilisateurs pour alerter l'utilisateur de tout problème, donc je pense que l'attrape devrait être fait dans le contrôleur d'actions plutôt que dans la classe qui gère l'appel de savon.

Quelqu'un peut-il s'il vous plaît aviser où je pourrais me tromper?

Je déteste le code/les solutions désordonnés et je veux m'en tenir au principe DRY autant que possible. Je pense que je pourrais aussi manquer certaines fonctionnalités intégrées de symfony qui pourraient aider avec cela mais chaque fois que je cherche, je trouve généralement des exemples qui sont pour symfony 1.2, j'utilise 1.4.

Quelques exemples seraient grands, merci.

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/paiement/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 */ 
    } 
} 

Répondre

3

On ne caractéristique très bien connu de Symfony est que les exceptions peuvent gérer le contenu envoyé dans une réponse. Ainsi, vous pouvez faire quelque chose comme ceci:

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

Si vous avez besoin d'un traitement plus propre des exceptions SOAP, comme paramètre clignote, etc., vous aurez probablement attraper chaque exception. Une idée ici pourrait être de créer une classe SoapException générique qui est étendue par des SoapExceptions plus spécifiques afin que vous n'ayez pas à intercepter un tas de types différents. Le code ci-dessus peut également être un mécanisme de repli utile.

Enfin, oui, vous devez placer des exceptions personnalisées dans lib/exception.

+0

Je ne vois pas de répertoire 'lib/exception'. Cependant, je vois un répertoire 'lib/vendor/symfony/lib/exception'; est-ce le répertoire que vous voulez dire? – rlandster

+0

@rlandster Créez simplement un répertoire 'lib/exception'. 'lib/vendor /' est pour les bibliothèques tierces et ne devrait pas être modifié. – takteek