2017-10-10 55 views
0

下面是「Paytrail_Module_Rest.php」的示例代碼,這是一組用於與支付網關的其餘api交互的類。某些類可以提前實例化,例如(Paytrail_Module_rest持有憑證),但有些需要用僅在控制器中可用的信息實例化(例如Paytrail_Module_Rest_Payment_S1,其設置付款細節如價格)如何在slim3中注入更復雜的服務,如Paytrail

Can任何人都建議將其注入slim3的乾淨方式?我看不到使用標準容器注入方法的好方法。

$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(); 

(這裏列出憑據公開測試證書)

+0

Slim支持任何PSR-7 HTTP消息實現。您可以爲此編寫一箇中間件並使用操作中的屬性。 – DanielO

回答

1

添加不改變的容器,如模塊和網址設定啄

$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'); 
}; 

的東西,然後你要麼可以每當需要時添加一個輔助類或者像適配器一樣添加輔助類:

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

} 

然後將適配器也添加到容器中:

$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] 
    ); 
};