/**
  * @param CurrencyPair $currencyPair
  * @return Rate
  * @throws Exception
  */
 public function fetchRate(CurrencyPair $currencyPair)
 {
     $providers = [$this->mainProvider => CurrencyRateProvider::getByName($this->mainProvider), $this->secondProvider => CurrencyRateProvider::getByName($this->secondProvider)];
     if (count($providers) !== 2) {
         throw new Exception('One of providers not found');
     }
     $rates = [];
     /** @var CurrencyRateProvider $provider */
     foreach ($providers as $name => $provider) {
         if (null === $provider) {
             throw new Exception("Provider \"{$name}\" not found!");
         }
         try {
             $providerHandler = $provider->getImplementationInstance($this->httpAdapter);
             if ($providerHandler !== null) {
                 $swap = new Swap($providerHandler);
                 $rate = $swap->quote($currencyPair->getBaseCurrency() . '/' . $currencyPair->getQuoteCurrency())->getValue();
                 $rates[] = floatval($rate);
             } else {
                 throw new Exception('Provider "' . $provider->name . '" not found');
             }
         } catch (\Exception $e) {
             throw new Exception('One or more currency providers did not return result');
         }
     }
     $min = min($rates);
     $max = max($rates);
     return new Rate($max - $min >= $max * $this->criticalDifference / 100 ? $max : $rates[0], new \DateTime());
 }
예제 #2
0
 /**
  * Relation to CurrencyRateProvider model
  *
  * @return CurrencyRateProvider
  */
 public function getRateProvider()
 {
     return CurrencyRateProvider::getByName($this->currency_rate_provider_name);
 }