DuC-cnZj /
ip
| 1 | <?php |
||
| 2 | |||
| 3 | namespace DucCnzj\Ip\Traits; |
||
| 4 | |||
| 5 | use DucCnzj\Ip\Imp\IpImp; |
||
| 6 | use DucCnzj\Ip\Exceptions\IncorrectInstanceException; |
||
| 7 | use DucCnzj\Ip\Exceptions\IpProviderClassNotExistException; |
||
| 8 | |||
| 9 | trait HandleProvider |
||
| 10 | { |
||
| 11 | /** |
||
| 12 | * @var \Closure[] |
||
| 13 | */ |
||
| 14 | protected $bindings = []; |
||
| 15 | |||
| 16 | /** |
||
| 17 | * @var array |
||
| 18 | */ |
||
| 19 | protected $withConfigurations = ['taobao' => false]; |
||
| 20 | |||
| 21 | /** |
||
| 22 | * @var array |
||
| 23 | */ |
||
| 24 | protected $providerConfig = []; |
||
| 25 | |||
| 26 | /** |
||
| 27 | * @var array|null ['baidu', 'taobao'] |
||
| 28 | */ |
||
| 29 | protected $providers = []; |
||
| 30 | |||
| 31 | /** |
||
| 32 | * @param string $provider |
||
| 33 | * @param string $concrete |
||
| 34 | * @param bool $hasConfig |
||
| 35 | * |
||
| 36 | * @return HandleProvider |
||
| 37 | * |
||
| 38 | * @author duc <[email protected]> |
||
| 39 | */ |
||
| 40 | 13 | public function bind(string $provider, $concrete, $hasConfig = true) |
|
| 41 | { |
||
| 42 | 13 | $this->bindings[$provider] = $this->getClosure($provider, $concrete); |
|
| 43 | 13 | $this->withConfigurations = $this->withConfigurations + [$provider => $hasConfig]; |
|
| 44 | |||
| 45 | 13 | return $this; |
|
| 46 | } |
||
| 47 | |||
| 48 | /** |
||
| 49 | * @param string $provider |
||
| 50 | * @param string $concrete |
||
| 51 | * @return \Closure |
||
| 52 | * |
||
| 53 | * @author duc <[email protected]> |
||
| 54 | */ |
||
| 55 | protected function getClosure(string $provider, $concrete = null) |
||
| 56 | { |
||
| 57 | 15 | return function () use ($provider, $concrete) { |
|
| 58 | 14 | return $this->createProvider($provider, $concrete); |
|
| 59 | 15 | }; |
|
| 60 | } |
||
| 61 | |||
| 62 | /** |
||
| 63 | * @param string $provider |
||
| 64 | * |
||
| 65 | * @param string $concrete |
||
| 66 | * @return IpImp |
||
| 67 | * @throws IpProviderClassNotExistException |
||
| 68 | * @throws \ReflectionException |
||
| 69 | * @author duc <[email protected]> |
||
| 70 | */ |
||
| 71 | 14 | protected function createProvider(string $provider, $concrete) |
|
| 72 | { |
||
| 73 | 14 | if (is_object($concrete)) { |
|
|
0 ignored issues
–
show
introduced
by
Loading history...
|
|||
| 74 | 10 | if (! $concrete instanceof IpImp) { |
|
| 75 | 1 | $class = get_class($concrete); |
|
| 76 | 1 | throw new IncorrectInstanceException("{$class} is not instanceof " . IpImp::class); |
|
| 77 | } |
||
| 78 | |||
| 79 | 9 | return $concrete; |
|
| 80 | } |
||
| 81 | |||
| 82 | 4 | $shortName = ucfirst(strtolower($provider)) . 'Ip'; |
|
| 83 | |||
| 84 | 4 | $class = $concrete ?: "\DucCnzj\Ip\Strategies\\{$shortName}"; |
|
| 85 | |||
| 86 | 4 | if (! class_exists($class)) { |
|
| 87 | 1 | throw new IpProviderClassNotExistException("{$class} 不存在"); |
|
| 88 | } |
||
| 89 | |||
| 90 | 3 | if (! (new \ReflectionClass($class))->implementsInterface(IpImp::class)) { |
|
| 91 | 1 | throw new IncorrectInstanceException("{$class} is not instanceof " . IpImp::class); |
|
| 92 | } |
||
| 93 | |||
| 94 | 2 | $config = $this->getProviderConfig($provider); |
|
| 95 | |||
| 96 | 2 | return new $class($config); |
|
| 97 | } |
||
| 98 | |||
| 99 | /** |
||
| 100 | * @return array |
||
| 101 | * |
||
| 102 | * @throws IpProviderClassNotExistException |
||
| 103 | * @author duc <[email protected]> |
||
| 104 | */ |
||
| 105 | 16 | public function resolveProviders() |
|
| 106 | { |
||
| 107 | 16 | $providerClosures = []; |
|
| 108 | |||
| 109 | 16 | foreach ($this->getProviders() as $provider) { |
|
| 110 | 16 | if (! $this->shouldNotSkip($provider)) { |
|
| 111 | 7 | continue; |
|
| 112 | } |
||
| 113 | |||
| 114 | 15 | if (! isset($this->bindings[$provider])) { |
|
| 115 | 3 | $this->bindings[$provider] = $this->getClosure($provider); |
|
| 116 | } |
||
| 117 | |||
| 118 | 15 | $providerClosures[$provider] = $this->bindings[$provider]; |
|
| 119 | } |
||
| 120 | |||
| 121 | 16 | return $providerClosures; |
|
| 122 | } |
||
| 123 | |||
| 124 | /** |
||
| 125 | * @param string ...$provider |
||
| 126 | * |
||
| 127 | * @return HandleProvider |
||
| 128 | * |
||
| 129 | * @author duc <[email protected]> |
||
| 130 | */ |
||
| 131 | 16 | public function useProvider(string ...$provider) |
|
| 132 | { |
||
| 133 | 16 | $providers = array_merge($this->providers ?? [], array_filter($provider)); |
|
| 134 | 16 | $this->providers = array_unique($providers); |
|
| 135 | |||
| 136 | 16 | return $this; |
|
| 137 | } |
||
| 138 | |||
| 139 | /** |
||
| 140 | * @param string ...$provider |
||
| 141 | * |
||
| 142 | * @return HandleProvider |
||
| 143 | * |
||
| 144 | * @author duc <[email protected]> |
||
| 145 | */ |
||
| 146 | 10 | public function use(string ...$provider) |
|
| 147 | { |
||
| 148 | 10 | return $this->useProvider(...$provider); |
|
| 149 | } |
||
| 150 | |||
| 151 | /** |
||
| 152 | * @return HandleProvider |
||
| 153 | * |
||
| 154 | * @author duc <[email protected]> |
||
| 155 | */ |
||
| 156 | 2 | public function clearUse() |
|
| 157 | { |
||
| 158 | 2 | $this->providers = null; |
|
| 159 | |||
| 160 | 2 | return $this; |
|
| 161 | } |
||
| 162 | |||
| 163 | /** |
||
| 164 | * @param $provider |
||
| 165 | * @return bool |
||
| 166 | * |
||
| 167 | * @author duc <[email protected]> |
||
| 168 | */ |
||
| 169 | 17 | public function shouldNotSkip($provider): bool |
|
| 170 | { |
||
| 171 | 17 | if (isset($this->withConfigurations[$provider])) { |
|
| 172 | 16 | if (! $this->withConfigurations[$provider] || ! ! $this->getProviderConfig($provider)) { |
|
| 173 | 16 | return true; |
|
| 174 | } |
||
| 175 | } |
||
| 176 | |||
| 177 | 8 | return ! ! $this->getProviderConfig($provider); |
|
| 178 | } |
||
| 179 | |||
| 180 | /** |
||
| 181 | * @return array |
||
| 182 | * |
||
| 183 | * @author duc <[email protected]> |
||
| 184 | */ |
||
| 185 | 19 | public function getProviders(): array |
|
| 186 | { |
||
| 187 | 19 | if (is_null($this->providers)) { |
|
| 188 | 1 | return []; |
|
| 189 | } |
||
| 190 | |||
| 191 | 19 | if (count($this->providers) === 0) { |
|
| 192 | 5 | return $this->providers = $this->getDefaultProviders(); |
|
| 193 | } |
||
| 194 | |||
| 195 | 15 | return $this->providers; |
|
| 196 | } |
||
| 197 | |||
| 198 | /** |
||
| 199 | * @param string $name |
||
| 200 | * |
||
| 201 | * @return mixed|null |
||
| 202 | * |
||
| 203 | * @author duc <[email protected]> |
||
| 204 | */ |
||
| 205 | 1 | public function getInstanceByName(string $name) |
|
| 206 | { |
||
| 207 | 1 | return isset($this->bindings[$name]) ? $this->bindings[$name] : null; |
|
| 208 | } |
||
| 209 | |||
| 210 | /** |
||
| 211 | * @param string $provider |
||
| 212 | * |
||
| 213 | * @return array|string |
||
| 214 | */ |
||
| 215 | 10 | public function getProviderConfig(string $provider) |
|
| 216 | { |
||
| 217 | 10 | if (! isset($this->providerConfig[$provider])) { |
|
| 218 | 10 | return []; |
|
| 219 | } |
||
| 220 | |||
| 221 | 3 | return $this->providerConfig[$provider]; |
|
| 222 | } |
||
| 223 | |||
| 224 | /** |
||
| 225 | * @return array |
||
| 226 | * |
||
| 227 | * @author duc <[email protected]> |
||
| 228 | */ |
||
| 229 | 5 | protected function getDefaultProviders() |
|
| 230 | { |
||
| 231 | return [ |
||
| 232 | 5 | 'baidu', |
|
| 233 | 'ali', |
||
| 234 | 'tencent', |
||
| 235 | 'taobao', |
||
| 236 | ]; |
||
| 237 | } |
||
| 238 | |||
| 239 | /** |
||
| 240 | * @param string ...$names |
||
| 241 | * |
||
| 242 | * @return array |
||
| 243 | * |
||
| 244 | * @author duc <[email protected]> |
||
| 245 | */ |
||
| 246 | 1 | public function getConfigs(string ...$names): array |
|
| 247 | { |
||
| 248 | 1 | if (empty($names)) { |
|
| 249 | 1 | return $this->providerConfig; |
|
| 250 | } |
||
| 251 | |||
| 252 | 1 | $result = []; |
|
| 253 | 1 | foreach ($names as $provider) { |
|
| 254 | 1 | $result[$provider] = $this->getProviderConfig($provider); |
|
| 255 | } |
||
| 256 | |||
| 257 | 1 | return $result; |
|
| 258 | } |
||
| 259 | |||
| 260 | /** |
||
| 261 | * @param array $configs |
||
| 262 | * |
||
| 263 | * @return HandleProvider |
||
| 264 | * |
||
| 265 | * @author duc <[email protected]> |
||
| 266 | */ |
||
| 267 | 1 | public function setConfigs(array $configs) |
|
| 268 | { |
||
| 269 | 1 | foreach ($configs as $provider => $config) { |
|
| 270 | 1 | $this->setProviderConfig($provider, $config); |
|
| 271 | } |
||
| 272 | |||
| 273 | 1 | return $this; |
|
| 274 | } |
||
| 275 | |||
| 276 | /** |
||
| 277 | * @param string $provider |
||
| 278 | * @param array|string $config |
||
| 279 | * |
||
| 280 | * @return HandleProvider |
||
| 281 | * |
||
| 282 | * @author duc <[email protected]> |
||
| 283 | */ |
||
| 284 | 3 | public function setProviderConfig(string $provider, $config) |
|
| 285 | { |
||
| 286 | 3 | $this->providerConfig[$provider] = $config; |
|
| 287 | |||
| 288 | 3 | return $this; |
|
| 289 | } |
||
| 290 | } |
||
| 291 |