Completed
Pull Request — master (#15)
by
unknown
02:55
created

GatewayBankProviderTrait   A

Complexity

Total Complexity 10

Size/Duplication

Total Lines 119
Duplicated Lines 0 %

Coupling/Cohesion

Components 3
Dependencies 4

Test Coverage

Coverage 92%

Importance

Changes 0
Metric Value
wmc 10
lcom 3
cbo 4
dl 0
loc 119
ccs 23
cts 25
cp 0.92
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A getProviderClasses() 0 8 2
A setProviderClasses() 0 4 1
A getGateway() 0 8 2
A setGateway() 0 4 1
A getProvider() 0 18 3
A defaultProviderClasses() 0 8 1
1
<?php
2
/**
3
 * @link https://github.com/yiiviet/yii2-payment
4
 * @copyright Copyright (c) 2017 Yii Viet
5
 * @license [New BSD License](http://www.opensource.org/licenses/bsd-license.php)
6
 */
7
8
namespace nhuluc\payment;
9
10
use Yii;
11
12
use yii\base\InvalidConfigException;
13
use yii\base\NotSupportedException;
14
use yii\di\Instance;
15
16
/**
17
 * Trait GatewayBankProviderTrait bồ sung các thuộc tính, phương thức lấy thông tin ngân hàng
18
 *
19
 * @property BankProvider $provider đối tượng cung cấp thông tin ngân hàng
20
 * @property PaymentGatewayInterface $gateway
21
 * @property array $providerClasses có khóa là lớp đối tượng cổng thanh toán và giá trị là lớp đối tượng cung cấp thông tin ngân hàng.
22
 *
23
 * @author Nhu Luc <[email protected]>
24
 * @since 1.0.3
25
 */
26
trait GatewayBankProviderTrait
27
{
28
29
    /**
30
     * @var array hổ trợ thiết lập giá trị của đối tượng cung cấp thông tin ngân hàng như chỉ định chỉ lấy danh sách bank qr code, offline, online...
31
     */
32
    public $providerConfig = [];
33
34
    /**
35
     * @var array|null có khóa là lớp đối tượng cổng thanh toán và giá trị là lớp đối tượng cung cấp thông tin ngân hàng.
36
     * @see [[getProviderClasses()]]
37
     * @see [[setProviderClasses()]]
38
     */
39
    private $_providerClasses;
40
41
    /**
42
     * Phương thức hổ trợ lấy thông tin lớp đối tượng cung cấp mã và thông tin ngân hàng của cổng thanh toán.
43
     *
44
     * @return array có khóa là lớp đối tượng cổng thanh toán và giá trị là lớp đối tượng cung cấp thông tin ngân hàng.
45
     */
46 9
    public function getProviderClasses(): array
47
    {
48 9
        if ($this->_providerClasses === null) {
49 9
            $this->setProviderClasses([]);
50
        }
51
52 9
        return $this->_providerClasses;
53
    }
54
55
    /**
56
     * Phương thức hổ trợ thiết lập thông tin lớp đối tượng cung cấp mã và thông tin ngân hàng của cổng thanh toán.
57
     *
58
     * @param array $providerClasses có khóa là lớp đối tượng cổng thanh toán và giá trị là lớp đối tượng cung cấp thông tin ngân hàng.
59
     */
60 9
    public function setProviderClasses(array $providerClasses): void
61
    {
62 9
        $this->_providerClasses = array_merge($this->defaultProviderClasses(), $providerClasses);
63 9
    }
64
65
    /**
66
     * @var PaymentGatewayInterface|null đối tượng cổng thanh toán.
67
     * @see [[getGateway()]]
68
     * @see [[setGateway()]]
69
     */
70
    private $_gateway;
71
72
    /**
73
     * Phương thức cung cấp cổng thanh toán để lấy thông tin các ngân hàng từ nó cung cấp.
74
     *
75
     * @return PaymentGatewayInterface đối tượng cổng thanh toán.
76
     * @throws InvalidConfigException
77
     */
78 10
    public function getGateway(): PaymentGatewayInterface
79
    {
80 10
        if ($this->_gateway === null) {
81 1
            throw new InvalidConfigException('Property `gateway` must be set!');
82
        } else {
83 9
            return $this->_gateway;
84
        }
85
    }
86
87
    /**
88
     * Phương thức hổ trợ thiết lập đối tượng cổng thanh toán
89
     * @see [[getGateway()]]
90
     *
91
     * @param array|string|PaymentGatewayInterface $gateway đối tượng hoặc cấu hình của cổng thanh toán muốn thiết lập.
92
     * @throws InvalidConfigException
93
     */
94 9
    public function setGateway($gateway): void
95
    {
96 9
        $this->_gateway = Instance::ensure($gateway, PaymentGatewayInterface::class);
97 9
    }
98
99
    /**
100
     * @var null|BankProvider đối tượng cung cấp dữ liệu ngân hàng
101
     * @see [[getBankProvider()]]
102
     */
103
    private $_provider;
104
105
    /**
106
     * Phương thức hổ trợ lấy đối tượng cung cấp dữ liệu ngân hàng để lấy thông tin hiển thị.
107
     *
108
     * @return BankProvider|object
109
     * @throws \yii\base\InvalidConfigException|NotSupportedException
110
     */
111 10
    public function getProvider(): BankProvider
112
    {
113 10
        if (!$this->_provider instanceof BankProvider) {
114 10
            $gatewayClass = get_class($this->gateway);
115
116 9
            if (isset($this->providerClasses[$gatewayClass])) {
117 9
                $config = array_merge($this->providerConfig, [
118 9
                    'class' => $this->providerClasses[$gatewayClass]
119
                ]);
120
121 9
                return $this->_provider = Yii::createObject($config, [$this->gateway]);
122
            } else {
123
                throw new NotSupportedException("Gateway: `$gatewayClass` is not supported!");
124
            }
125
        } else {
126
            return $this->_provider;
127
        }
128
    }
129
130
    /**
131
     * Phương thức cung cấp các lớp đối tượng lấy thông tin ngân hàng mặc định.
132
     *
133
     * @return array có khóa là lớp đối tượng cổng thanh toán và giá trị là lớp đối tượng cung cấp thông tin ngân hàng.
134
     */
135 9
    protected function defaultProviderClasses(): array
136
    {
137
        return [
138 9
            'yiiviet\payment\baokim\PaymentGateway' => 'yiiviet\payment\baokim\BankProvider',
139
            'yiiviet\payment\nganluong\PaymentGateway' => 'yiiviet\payment\nganluong\BankProvider',
140
            'yiiviet\payment\vnpayment\PaymentGateway' => 'yiiviet\payment\vnpayment\BankProvider'
141
        ];
142
    }
143
144
}
145