Php 如何在slim3中注入更复杂的服务,如Paytrail
下面是Paytrail_Module_Rest.php的示例代码,这是一组用于与支付网关的Rest api交互的类。一些类可以提前实例化,例如Paytrail\u Module\u rest,它持有凭证,但一些类需要实例化时只使用控制器中可用的信息,例如Paytrail\u Module\u rest\u Payment\u S1,它设置支付细节,如价格 有人能建议一种干净的方法把它注射到slim3中吗?我看不出用标准容器注射方法有什么好办法Php 如何在slim3中注入更复杂的服务,如Paytrail,php,dependency-injection,slim,slim-3,Php,Dependency Injection,Slim,Slim 3,下面是Paytrail_Module_Rest.php的示例代码,这是一组用于与支付网关的Rest api交互的类。一些类可以提前实例化,例如Paytrail\u Module\u rest,它持有凭证,但一些类需要实例化时只使用控制器中可用的信息,例如Paytrail\u Module\u rest\u Payment\u S1,它设置支付细节,如价格 有人能建议一种干净的方法把它注射到slim3中吗?我看不出用标准容器注射方法有什么好办法 $urlset = new\App\Service\
$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();
此处列出的凭据是公共测试凭据添加不会更改到容器中的内容,如模块和urlset内容
$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]
);
};
Slim支持任何PSR-7 HTTP消息实现。您可以为此编写一个中间件,并使用操作中的属性。