Jump to content
php.lv forumi

Rodny

Reģistrētie lietotāji
  • Posts

    1
  • Joined

  • Last visited

Posts posted by Rodny

  1. Tātad Tev vajadzēs kaut ko tādu iekš HTDOCS mapes uztaisīt zem hosta mapi ar nosaukumu: Service tālāk taisam iekš mapes: Factory.php / Registry.php

     

    Factory.php

    <?php
    
    declare(strict_types=1);
    
    /*
     * This file is part of Swap.
     *
     * (c) Florian Voutzinos <[email protected]>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    namespace Swap\Service;
    
    use Exchanger\Service\HttpService;
    use Http\Client\HttpClient;
    use Http\Discovery\HttpClientDiscovery;
    use Http\Discovery\Psr17FactoryDiscovery;
    use Psr\Http\Client\ClientInterface;
    use Http\Message\RequestFactory;
    use Psr\Http\Message\RequestFactoryInterface;
    
    /**
     * Helps building services.
     *
     * @author Florian Voutzinos <[email protected]>
     */
    final class Factory
    {
        /**
         * The client.
         *
         * @var HttpClient
         */
        private $httpClient;
    
        /**
         * The request factory.
         *
         * @var RequestFactory
         */
        private $requestFactory;
    
        /**
         * The service registry.
         *
         * @var Registry
         */
        private $registry;
    
        /**
         * @param HttpClient|ClientInterface|null $httpClient
         * @param RequestFactoryInterface|null    $requestFactory
         */
        public function __construct($httpClient = null, RequestFactoryInterface $requestFactory = null)
        {
            if (null === $httpClient) {
                $httpClient = HttpClientDiscovery::find();
            } else {
                if (!$httpClient instanceof ClientInterface && !$httpClient instanceof HttpClient) {
                    throw new \LogicException('Client must be an instance of Http\\Client\\HttpClient or Psr\\Http\\Client\\ClientInterface');
                }
            }
    
            $this->httpClient = $httpClient;
            $this->requestFactory = $requestFactory ?: Psr17FactoryDiscovery::findRequestFactory();
            $this->registry = new Registry();
        }
    
        /**
         * Sets the http client.
         *
         * @param HttpClient|ClientInterface $httpClient
         */
        public function setHttpClient($httpClient): void
        {
            if (!$httpClient instanceof ClientInterface && !$httpClient instanceof HttpClient) {
                throw new \LogicException('Client must be an instance of Http\\Client\\HttpClient or Psr\\Http\\Client\\ClientInterface');
            }
    
            $this->httpClient = $httpClient;
        }
    
        /**
         * Sets the request factory.
         *
         * @param RequestFactoryInterface $requestFactory
         */
        public function setRequestFactory(RequestFactoryInterface $requestFactory): void
        {
            $this->requestFactory = $requestFactory;
        }
    
        /**
         * Creates a new service.
         *
         * @param string $serviceName
         * @param array  $args
         *
         * @return \Exchanger\Contract\ExchangeRateService
         */
        public function create(string $serviceName, array $args = [])
        {
            if (!$this->registry->has($serviceName)) {
                throw new \LogicException(sprintf('The service "%s" is not registered.', $serviceName));
            }
    
            $classOrCallable = $this->registry->get($serviceName);
    
            if (is_callable($classOrCallable)) {
                return call_user_func($classOrCallable);
            }
    
            if (is_subclass_of($classOrCallable, HttpService::class)) {
                return new $classOrCallable($this->httpClient, $this->requestFactory, $args);
            }
    
            $r = new \ReflectionClass($classOrCallable);
    
            return $r->newInstanceArgs($args);
        }
    }
    ?>

    Registry.php

    <?php
    
    declare(strict_types=1);
    
    /*
     * This file is part of Swap.
     *
     * (c) Florian Voutzinos <[email protected]>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    namespace Swap\Service;
    
    use Exchanger\Service\Registry as ExchangerRegistry;
    
    /**
     * Holds services.
     *
     * @author Florian Voutzinos <[email protected]>
     */
    final class Registry
    {
        /**
         * The registered services.
         *
         * @var array
         */
        private static $services = [];
    
        /**
         * Constructor.
         */
        public function __construct()
        {
            $this->registerServices();
        }
    
        /**
         * Tells of the registry has the given service.
         *
         * @param string $name The service name
         *
         * @return bool
         */
        public function has(string $name): bool
        {
            return isset(self::$services[$name]);
        }
    
        /**
         * Gets a service.
         *
         * @param string $name The service name
         *
         * @return string|null
         */
        public function get(string $name)
        {
            return isset(self::$services[$name]) ? self::$services[$name] : null;
        }
    
        /**
         * Registers a new service.
         *
         * @param string          $name            The service name
         * @param string|callable $classOrCallable The class name or a callable
         *
         * @throws \InvalidArgumentException
         */
        public static function register(string $name, $classOrCallable): void
        {
            self::$services[$name] = $classOrCallable;
        }
    
        /**
         * Registers the core services.
         */
        private function registerServices(): void
        {
            $services = ExchangerRegistry::getServices();
    
            foreach ($services as $name => $class) {
                self::register($name, $class);
            }
        }
    }
    ?>

    Tagad laižam tālāk!

    Tagad mums atkal vajadzēs divus failus: Builder.php / Swap.php ->

    Builder.php

    <?php
    
    declare(strict_types=1);
    
    /*
     * This file is part of Swap.
     *
     * (c) Florian Voutzinos <[email protected]>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    namespace Swap;
    
    use Exchanger\Contract\ExchangeRateService;
    use Exchanger\Exchanger;
    use Exchanger\Service\Chain;
    use Http\Client\HttpClient;
    use Psr\SimpleCache\CacheInterface;
    use Swap\Service\Factory;
    use Psr\Http\Client\ClientInterface;
    use Psr\Http\Message\RequestFactoryInterface;
    
    /**
     * Helps building Swap.
     *
     * @author Florian Voutzinos <[email protected]>
     */
    final class Builder
    {
        /**
         * The services.
         *
         * @var array
         */
        private $services = [];
    
        /**
         * The options.
         *
         * @var array
         */
        private $options = [];
    
        /**
         * The http client.
         *
         * @var HttpClient
         */
        private $httpClient;
    
        /**
         * The request factory.
         *
         * @var RequestFactoryInterface
         */
        private $requestFactory;
    
        /**
         * The cache.
         *
         * @var CacheInterface
         */
        private $cache;
    
        /**
         * Constructor.
         *
         * @param array $options
         */
        public function __construct(array $options = [])
        {
            $this->options = $options;
        }
    
        /**
         * Adds a service by service name.
         *
         * @param string $serviceName
         * @param array  $options
         *
         * @return Builder
         */
        public function add(string $serviceName, array $options = []): self
        {
            $this->services[$serviceName] = $options;
    
            return $this;
        }
    
        /**
         * Add a service by service instance.
         *
         * @param ExchangeRateService $exchangeRateService
         *
         * @return Builder
         */
        public function addExchangeRateService(ExchangeRateService $exchangeRateService): self
        {
            $this->services[spl_object_hash($exchangeRateService)] = $exchangeRateService;
    
            return $this;
        }
    
        /**
         * Uses the given http client.
         *
         * @param HttpClient|ClientInterface $httpClient
         *
         * @return Builder
         */
        public function useHttpClient($httpClient): self
        {
            if (!$httpClient instanceof ClientInterface && !$httpClient instanceof HttpClient) {
                throw new \LogicException('Client must be an instance of Http\\Client\\HttpClient or Psr\\Http\\Client\\ClientInterface');
            }
    
            $this->httpClient = $httpClient;
    
            return $this;
        }
    
        /**
         * Uses the given request factory.
         *
         * @param RequestFactoryInterface $requestFactory
         *
         * @return Builder
         */
        public function useRequestFactory(RequestFactoryInterface $requestFactory): self
        {
            $this->requestFactory = $requestFactory;
    
            return $this;
        }
    
        /**
         * Uses the given simple cache.
         *
         * @param CacheInterface $cache
         *
         * @return Builder
         */
        public function useSimpleCache(CacheInterface $cache): self
        {
            $this->cache = $cache;
    
            return $this;
        }
    
        /**
         * Builds Swap.
         *
         * @return Swap
         */
        public function build(): Swap
        {
            $serviceFactory = new Factory($this->httpClient, $this->requestFactory);
    
            /** @var ExchangeRateService[] $services */
            $services = [];
    
            foreach ($this->services as $name => $optionsOrService) {
                /** @var array|ExchangeRateService $optionsOrService */
                if ($optionsOrService instanceof ExchangeRateService) {
                    $services[] = $optionsOrService;
                } else {
                    $services[] = $serviceFactory->create($name, $optionsOrService);
                }
            }
    
            $service = new Chain($services);
            $exchanger = new Exchanger($service, $this->cache, $this->options);
    
            return new Swap($exchanger);
        }
    }
    ?>

    Swap.php

    <?php
    
    declare(strict_types=1);
    
    /*
     * This file is part of Swap.
     *
     * (c) Florian Voutzinos <[email protected]>
     *
     * For the full copyright and license information, please view the LICENSE
     * file that was distributed with this source code.
     */
    
    namespace Swap;
    
    use Exchanger\Contract\ExchangeRateProvider;
    use Exchanger\ExchangeRateQueryBuilder;
    use Exchanger\Contract\ExchangeRate as ExchangeRateContract;
    
    /**
     * Swap is an easy to use facade to retrieve exchange rates from various services.
     *
     * @author Florian Voutzinos <[email protected]>
     */
    class Swap
    {
        /**
         * The exchange rate provider.
         *
         * @var ExchangeRateProvider
         */
        private $exchangeRateProvider;
    
        /**
         * Creates a new Swap.
         *
         * @param ExchangeRateProvider $exchangeRateProvider
         */
        public function __construct(ExchangeRateProvider $exchangeRateProvider)
        {
            $this->exchangeRateProvider = $exchangeRateProvider;
        }
    
        /**
         * Quotes a currency pair.
         *
         * @param string $currencyPair The currency pair like "EUR/USD"
         * @param array  $options      An array of query options
         *
         * @return ExchangeRateContract
         */
        public function latest(string $currencyPair, array $options = []): ExchangeRateContract
        {
            return $this->quote($currencyPair, null, $options);
        }
    
        /**
         * Quotes a currency pair.
         *
         * @param string             $currencyPair The currency pair like "EUR/USD"
         * @param \DateTimeInterface $date         An optional date for historical rates
         * @param array              $options      An array of query options
         *
         * @return ExchangeRateContract
         */
        public function historical(string $currencyPair, \DateTimeInterface $date, array $options = []): ExchangeRateContract
        {
            return $this->quote($currencyPair, $date, $options);
        }
    
        /**
         * Quotes a currency pair.
         *
         * @param string             $currencyPair The currency pair like "EUR/USD"
         * @param \DateTimeInterface $date         An optional date for historical rates
         * @param array              $options      An array of query options
         *
         * @return ExchangeRateContract
         */
        private function quote(string $currencyPair, \DateTimeInterface $date = null, array $options = []): ExchangeRateContract
        {
            $exchangeQueryBuilder = new ExchangeRateQueryBuilder($currencyPair);
    
            if (null !== $date) {
                $exchangeQueryBuilder->setDate($date);
            }
    
            foreach ($options as $name => $value) {
                $exchangeQueryBuilder->addOption($name, $value);
            }
    
            $query = $exchangeQueryBuilder->build();
    
            return $this->exchangeRateProvider->getExchangeRate($query);
        }
    }
    ?>

    Viss ir izdarīts un tālāk jau notiek ievades un izvades! We are done.

×
×
  • Create New...