Php 如何在slim3中注入更复杂的服务,如Paytrail

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\

下面是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\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消息实现。您可以为此编写一个中间件,并使用操作中的属性。