app = $app; } /** * Register known providers by contract * @param object $provider * @param int|null $priority * @return void */ public function registerByContract($provider, ?int $priority = null) { if ($provider instanceof Provider) { if ($provider instanceof PaymentProvider) { $this->app->hooks()->billsPaymentProviderRegister($provider, $priority); } elseif ($provider instanceof SmsProvider) { $this->app->hooks()->sendmailSmsProviderRegister($provider, $priority); } elseif ($provider instanceof TranslationProvider) { $this->app->hooks()->localeTraslationProviderRegister($provider, $priority); } elseif ($provider instanceof CurrencyRatesProvider) { CurrencyRates::registerProvider($provider, $priority); } elseif ($provider instanceof IpLocationProvider) { $this->app->hooks()->ipLocationProviderRegister($provider, $priority); } elseif ($provider instanceof GeocodeProvider) { $this->app->hooks()->geoGeocodeProviderRegister($provider, $priority); } elseif ($provider instanceof MapsProvider) { $this->app->hooks()->geoMapsProviderRegister($provider, $priority); } } } /** * Register provider * @param string $groupKey * @param Provider|Closure|mixed $provider * @param int|null $priority * @return void */ public function register(string $groupKey, $provider, ?int $priority = null) { if (is_null($priority) || $priority < 0) { $priority = 5; } $this->registered[$groupKey][$priority][] = $provider; } /** * Init providers list * @param string $groupKey * @param string $contract * @param string|null $providerKey * @param array $opts * @return array | Provider[] */ public function get(string $groupKey, string $contract, ?string $providerKey = null, array $opts = []) { $opts = $this->defaults($opts, [ 'once' => true, 'onInit' => false, ]); if (! array_key_exists($groupKey, $this->inited) || ! $opts['once']) { $this->inited[$groupKey] = []; $keyMethod = $opts['keyMethod'] ?? 'providerKey'; if (! empty($this->registered[$groupKey])) { for ($p = 0; $p <= static::PRIORITY_LIMIT; $p++) { if (! empty($this->registered[$groupKey][$p])) { foreach ($this->registered[$groupKey][$p] as $provider) { if ($provider instanceof Closure) { $provider = $provider($opts); } if (is_string($provider) && class_exists($provider)) { $provider = new $provider(); } if ($provider instanceof $contract) { $this->inited[$groupKey][$provider->$keyMethod()] = $provider; } } } } } if ($opts['onInit'] instanceof Closure) { $opts['onInit']($this->inited[$groupKey]); } } if ($providerKey) { return $this->inited[$groupKey][$providerKey] ?? null; } return $this->inited[$groupKey]; } }