Componette

Componette

h4kuna

h4kuna / exchange v7.1.1

ČNB, ECB, RB exchange rates, fiat exchange, built-in cache, expandable for other banks, PSR-7, 17, 18

download-cloud-line composer require h4kuna/exchange

Exchange

Downloads this Month Latest Stable Version Coverage Status Total Downloads License

Exchange is PHP script works with currencies. You can convert price.

Here is changelog.

Extension for framework

Installation via composer

$ composer require h4kuna/exchange

Optional packages

$ composer require guzzlehttp/guzzle guzzlehttp/psr7 h4kuna/dir nette/caching

Support PSR-6 for cache.

How to use

Init object Exchange by ExchangeFactory. Default Driver for read is Cnb, here are others.

For example define own exchange rates:

  • 25 CZK = 1 EUR
  • 20 CZK = 1 USD
use h4kuna\Exchange\Currency\Property;
use h4kuna\Exchange\Driver\Cnb\Day;
use h4kuna\Exchange\Exchange;
use h4kuna\Exchange\ExchangeFactory;
use h4kuna\Exchange\RatingList\CacheEntity;
use h4kuna\Exchange\RatingList\RatingList;

{ # by factory
	$exchangeFactory = new ExchangeFactory(
		from: 'eur',
		to: 'usd',
		allowedCurrencies: [
			'CZK',
			'USD',
			'eur', // lower case will be changed to upper case
		],
	);

	$exchange = $exchangeFactory->create();
}

{ # custom RatingList
	$ratingList = new RatingList(new DateTimeImmutable(), new DateTimeImmutable(), null, [
		'EUR' => new Property(1, 25.0, 'EUR'),
		'USD' => new Property(1, 20.0, 'USD'),
		'CZK' => new Property(1, 1.0, 'CZK'),
	]);
	$exchange = new Exchange('EUR', $ratingList, 'USD');
}

echo $exchange->change(100) . PHP_EOL; // EUR -> USD = 125.0

// use only upper case
echo $exchange->change(100, 'CZK') . PHP_EOL; // CZK -> USD = 5.0
echo $exchange->change(100, null, 'CZK') . PHP_EOL; // EUR -> CZK = 2500.0
echo $exchange->change(100, 'USD', 'CZK') . PHP_EOL; // USD -> CZK = 2000.0

Change driver and date

Download history exchange rates. Make new instance of Exchange with history rate.

use h4kuna\Exchange\RatingList;
use h4kuna\Exchange;

$exchangePast = $exchangeFactory->create(cacheEntity: new CacheEntity(new Datetime('2000-12-30'), new Day));
echo $exchangePast->change(100) . PHP_EOL;

Access and iterator

use h4kuna\Exchange\Currency\Property;
/* @var $property Property */
$property = $exchange['EUR'];
var_dump($property);
echo PHP_EOL;

foreach ($exchange as $code => $property) {
	/* @var $property Property */
	var_dump($code, $property);
}

Caching

The cache invalid automatic at some time, defined by property SourceData::$refresh. From this property is counted time to live. Little better is invalid cache by cron. Because one request on server does not lock other requests. Let's run cron max. 29 minutes before invalidate cache.

use h4kuna\Exchange\RatingList\RatingListCache;
use h4kuna\Exchange\RatingList\CacheEntity;
use h4kuna\Exchange\Driver\Cnb\Day;

/** @var RatingListCache $ratingListCache */
$ratingListCache->rebuild(new CacheEntity(null, new Day));

In example, is used h4kuna\Exchange\Driver\Cnb\Day::$refresh is defined at 14:30 + 30 minute the cache is valid. Run cron 14:32 every day.

  • v7.1.1 v7.1.1

    Full Changelog: v7.1.0...v7.1.1

  • v7.0.9

    • add support RaiffeisenBank
  • v7.0.8

    fix cache validation

  • v7.0.5

    • fix cache validation
    • add new rebuild method for cache
    • allowed psr-message 2.0
  • v7.0.4

    • add right dependencies
    • Exchange: keep internal object instead of string like currency code
  • v7.0.2

    • Driver: add timezone
    • Driver: add lazy mode via DriverAccessor
  • v7.0.1 v7.0.1

    • remove dependency on h4kuna/number-format
    • Formats.php and Filters.php moved this extension
  • v7.0.0 v7.0.0

    • your temporary rate implement by own RatingList
    • custom driver must be to use in Builder, see to ExchangeFactory
    • cache is implemented by PSR-6
    • remove dependency on Guzzle, PSR-7, PRS-17 and PSR-18 ready
    • remove dependency on h4kuna/data-type, nette/safe-stream, nette/utils
    • access for currency use RatingList instead of Exchange, Exchange::getRatingList()['EUR']
    • support php 8.0+
    • Exchange methods that are preserved are the same prototype and behavior
    • CookieManager moved this extension
Componette Componette felix@nette.org