From 4b3320ccc6a41ab74647ce6fbddcbdc0ff29fc4a Mon Sep 17 00:00:00 2001 From: Daniel Subiabre Date: Sun, 22 Mar 2026 19:37:31 +0100 Subject: [PATCH] fix: add load step for other provider dependent exchange operations --- src/Money/Conversion/Exchange/AbstractExchange.php | 12 ++++++++++++ .../Exchange/EuropeanCentralBankExchange.php | 7 +------ .../Conversion/Exchange/FrankfurterExchange.php | 7 +------ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Money/Conversion/Exchange/AbstractExchange.php b/src/Money/Conversion/Exchange/AbstractExchange.php index 047a06e..21f9810 100644 --- a/src/Money/Conversion/Exchange/AbstractExchange.php +++ b/src/Money/Conversion/Exchange/AbstractExchange.php @@ -19,12 +19,20 @@ abstract class AbstractExchange implements ExchangeInterface protected CurrencyConverter $converter; protected ExchangeRateProvider $provider; + /** + * Here is where your implementation should pull the data from its sources. + * The methods `convert`, `getConversionRate`, and `getConversionDate` will call this method before making any operation. + */ + abstract protected function load(): void; + public function convert( MoneyInterface $from, string $toCurrency, ?Context $context = null, RoundingMode $roundingMode = RoundingMode::UP, ): MoneyInterface { + $this->load(); + $converted = $this->converter->convert( MoneyService::toBrick($from), $toCurrency, @@ -48,11 +56,15 @@ abstract class AbstractExchange implements ExchangeInterface public function getConversionRate(string $fromCurrency, string $toCurrency): float { + $this->load(); + return $this->provider->getExchangeRate($fromCurrency, $toCurrency)->toFloat(); } public function getConversionDate(string $fromCurrency, string $toCurrency): string { + $this->load(); + return $this->date; } } diff --git a/src/Money/Conversion/Exchange/EuropeanCentralBankExchange.php b/src/Money/Conversion/Exchange/EuropeanCentralBankExchange.php index d902c89..3fdfdbc 100644 --- a/src/Money/Conversion/Exchange/EuropeanCentralBankExchange.php +++ b/src/Money/Conversion/Exchange/EuropeanCentralBankExchange.php @@ -2,9 +2,6 @@ namespace App\Money\Conversion\Exchange; -use App\Money\MoneyInterface; -use Brick\Math\RoundingMode; -use Brick\Money\Context; use Brick\Money\CurrencyConverter; use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider; use Brick\Money\ExchangeRateProvider\ConfigurableProvider; @@ -48,7 +45,7 @@ class EuropeanCentralBankExchange extends AbstractExchange return self::WEIGHT; } - public function convert(MoneyInterface $from, string $toCurrency, ?Context $context = null, RoundingMode $roundingMode = RoundingMode::UP): MoneyInterface + protected function load(): void { $data = $this->getData(); @@ -61,8 +58,6 @@ class EuropeanCentralBankExchange extends AbstractExchange $this->date = $data['@attributes']['time']; $this->provider = new BaseCurrencyProvider($provider, self::ISO_4217); $this->converter = new CurrencyConverter($this->provider); - - return parent::convert($from, $toCurrency, $context, $roundingMode); } public function getData(): array diff --git a/src/Money/Conversion/Exchange/FrankfurterExchange.php b/src/Money/Conversion/Exchange/FrankfurterExchange.php index 3ff0eb3..ae13c85 100644 --- a/src/Money/Conversion/Exchange/FrankfurterExchange.php +++ b/src/Money/Conversion/Exchange/FrankfurterExchange.php @@ -2,9 +2,6 @@ namespace App\Money\Conversion\Exchange; -use App\Money\MoneyInterface; -use Brick\Math\RoundingMode; -use Brick\Money\Context; use Brick\Money\CurrencyConverter; use Brick\Money\ExchangeRateProvider\BaseCurrencyProvider; use Brick\Money\ExchangeRateProvider\ConfigurableProvider; @@ -38,7 +35,7 @@ class FrankfurterExchange extends AbstractExchange private CacheInterface $cache, ) {} - public function convert(MoneyInterface $from, string $toCurrency, ?Context $context = null, RoundingMode $roundingMode = RoundingMode::UP): MoneyInterface + protected function load(): void { $data = $this->cache->get( self::NAME, @@ -57,8 +54,6 @@ class FrankfurterExchange extends AbstractExchange $this->date = $data['date']; $this->provider = new BaseCurrencyProvider($provider, self::ISO_4217); $this->converter = new CurrencyConverter($this->provider); - - return parent::convert($from, $toCurrency, $context, $roundingMode); } private function getDataLatest(): array