2017-10-10 3 views
0

Ci-dessous un exemple de code pour "Paytrail_Module_Rest.php", un ensemble de classes pour interagir avec une API de repos pour une passerelle de paiement. Certaines des classes peuvent être instanciées à l'avance telles que (Paytrail_Module_rest qui contient des informations d'identification), mais certaines doivent être instanciées avec des informations uniquement disponibles dans le contrôleur (par exemple Paytrail_Module_Rest_Payment_S1 qui définit les détails de paiement tels que le prix)Comment injecter un service plus complexe dans slim3 tel que Paytrail

Quelqu'un suggère une façon propre de l'injecter dans slim3? Je ne vois pas de bon moyen de le faire avec les méthodes d'injection standard.

$urlset = new\App\Service\Paytrail\Paytrail_Module_Rest_Urlset(
    "https://www.demoshop.com/sv/success", // return address for successful payment 
    "https://www.demoshop.com/sv/failure", // return address for failed payment 
    "https://www.demoshop.com/sv/notify", // address for payment confirmation from Paytrail server 
    "" // pending url not in use 
); 

$orderNumber = '1'; 
$price = 99.00; 
$payment = new \App\Service\Paytrail\Paytrail_Module_Rest_Payment_S1($orderNumber, $urlset, $price); 

$payment->setLocale('en_US'); 

$module = new \App\Service\Paytrail\Paytrail_Module_Rest(13466, '6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ'); 

try { 
    $result = $module->processPayment($payment); 
} 
catch (\App\Service\Paytrail\Paytrail_Exception $e) { 
    die('Error in creating payment to Paytrail service:'. $e->getMessage()); 
} 

echo $result->getUrl(); 

(références énumérées ici sont des informations d'identification de test publics)

+0

Slim prend en charge toute implémentation de message HTTP PSR-7. Vous pourriez écrire un intergiciel pour cela et consommer les attributs dans l'action. – DanielO

Répondre

1

Ajouter les choses qui ne change pas au conteneur comme le module et le urlset thingy

$container[\App\Service\Paytrail\Paytrail_Module_Rest_Urlset::class] = function($c) { 
    return new \App\Service\Paytrail\Paytrail_Module_Rest_Urlset(
     "https://www.demoshop.com/sv/success", // return address for successful payment 
     "https://www.demoshop.com/sv/failure", // return address for failed payment 
     "https://www.demoshop.com/sv/notify", // address for payment confirmation from Paytrail server 
     "" // pending url not in use 
    ); 
}; 

$container[\App\Service\Paytrail\Paytrail_Module_Rest::class] = function($c) { 
    return new \App\Service\Paytrail\Paytrail_Module_Rest(13466, '6pKF4jkv97zmqBJ3ZL8gUw5DfT2NMQ'); 
}; 

Et puis vous pouvez soit instancier le paiement chaque fois que vous en avez besoin ou ajouter une classe auxiliaire comme un adaptateur:

class PaymentAdapter { 

    public function __construct(
      \App\Service\Paytrail\Paytrail_Module_Rest $module, 
      \App\Service\Paytrail\Paytrail_Module_Rest_Urlset $urlset) 
    { 
     $this->module = $module; 
     $this->urlset = $urlset; 
    } 

    function createAndProcessPayment($orderNumber, $price) 
    { 
     $payment = new \App\Service\Paytrail\Paytrail_Module_Rest_Payment_S1($orderNumber, $this->urlset, $price); 

     $payment->setLocale('en_US'); 
     try { 
      $result = $module->processPayment($payment); 
     } 
     catch (\App\Service\Paytrail\Paytrail_Exception $e) { 
      die('Error in creating payment to Paytrail service:'. $e->getMessage()); 
     } 
     return $result; 
    } 

} 

Ajoutez ensuite l'adaptateur également au conteneur:

$container[\yournamespace\PaymentAdapter::class] = function($c) { 
    return new \yournamespace\PaymentAdapter(
     $c[\App\Service\Paytrail\Paytrail_Module_Rest::class], 
     $c[\App\Service\Paytrail\Paytrail_Module_Rest_Urlset::class] 
    ); 
};