h4kuna / exchange
Exchange between currencies.
Fund package maintenance!
h4kuna
revolut.me/milan2m/czk1000/exchange
Installs: 37 043
Dependents: 1
Suggesters: 0
Security: 0
Stars: 22
Watchers: 7
Forks: 14
Open Issues: 0
Requires
- php: >=8.0
- h4kuna/critical-cache: ^v1.0
- malkusch/lock: ^2.2
- psr/http-client: ^1.0
- psr/http-factory: ^1.0
- psr/http-message: ^1.0 || ^2.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.5
- guzzlehttp/psr7: ^2.4
- h4kuna/dir: ^0.1.2
- mockery/mockery: ^1.6
- nette/caching: ^3.2
- nette/tester: ^2.5
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1.3
- phpstan/phpstan-strict-rules: ^1.5
- tracy/tracy: ^2.10
Suggests
- ext-simplexml: If you want to use h4kuna\Exchange\Driver\Ecb or h4kuna\Exchange\Driver\RB.
- guzzlehttp/guzzle: As default implementation for PSR standards.
- guzzlehttp/psr7: Minimum ^2.4 for guzzle.
- h4kuna/dir: If you want to use build-in factory.
- nette/caching: If you have not own PSR-6 implementation.
- dev-master
- v7.1.3
- v7.1.2
- v7.1.1
- v7.1.0
- v7.0.10
- v7.0.9
- v7.0.8
- v7.0.7
- v7.0.6
- v7.0.5
- v7.0.4
- v7.0.3
- v7.0.2
- v7.0.1
- v7.0.0
- v6.0.5
- v6.0.4
- v6.0.3
- v6.0.2
- v6.0.1
- v6.0.0
- v5.0.2
- v5.0.1
- v5.0.0
- v4.2.2
- v4.2.1
- v4.2.0
- v4.1.0
- v4.0.7
- v4.0.6
- v4.0.5
- v4.0.4
- v4.0.3
- v4.0.2
- v4.0.1
- v3.3.4
- v3.3.3
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.0
- v3.1.3
- v3.1.2
- v3.1.1
- v3.1.0
This package is auto-updated.
Last update: 2024-12-05 08:08:53 UTC
README
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.