elegantly/laravel-forex is a Laravel package for forex for laravel.
It currently has 4 GitHub stars and 4.014 downloads on Packagist (latest version v4.0.3).
Install it with composer require elegantly/laravel-forex.
Discover more Laravel packages by elegantly
or browse all Laravel packages to compare alternatives.
Last updated
Laravel Forex is a simple and flexible package for retrieving the latest and historical foreign exchange rates in your Laravel application.
By default, it uses the free tier from exchangerate-api.com, but you can easily configure it to use any other Forex provider.
Money instances between currencies with high precision using brick/money.^8.3^13.0Install the package via Composer:
composer require elegantly/laravel-forex
Publish the configuration file:
php artisan vendor:publish --tag="forex-config"
The published configuration file lives at config/forex.php:
use Brick\Math\RoundingMode;
use Elegantly\Forex\Integrations\ExchangeRateApiFree\ExchangeRateApiFreeConnector;
return [
/**
* Rounding mode used when converting money.
*/
'rounding_mode' => RoundingMode::HalfUp,
'cache' => [
'enabled' => true,
'driver' => env('FOREX_CACHE_DRIVER', env('CACHE_STORE', env('CACHE_DRIVER', 'file'))),
'expiry_seconds' => 86_400, // 1 day
],
'rate_limit' => [
'enabled' => false,
'driver' => env('FOREX_RATE_LIMIT_DRIVER', env('CACHE_STORE', env('CACHE_DRIVER', 'file'))),
'every_seconds' => 3_600, // 1 hour
],
'client' => ExchangeRateApiFreeConnector::class,
'clients' => [
'exchange-rate-api' => [
'token' => env('EXCHANGE_RATE_API_TOKEN'),
],
],
];
| Variable | Description |
| --- | --- |
| EXCHANGE_RATE_API_TOKEN | Your API token when using the paid exchangerate-api.com connector. |
| FOREX_CACHE_DRIVER | The cache store used for Forex responses. |
| FOREX_RATE_LIMIT_DRIVER | The cache store used for rate limiting. |
All public methods are available through the Forex facade:
use Elegantly\Forex\Facades\Forex;
Fetch the latest rates for a given base currency:
$rates = Forex::latest('USD');
$usdToEur = $rates['EUR'];
Fetch historical rates for a specific date:
use Carbon\Carbon;
$rates = Forex::rates(Carbon::create(2022, 4, 25), 'USD');
$usdToEur = $rates['EUR'];
Convert a Money instance from one currency to another:
use Brick\Math\RoundingMode;
use Brick\Money\Money;
use Elegantly\Forex\Facades\Forex;
$convertedMoney = Forex::convert(
money: Money::of(100, 'USD'),
currency: 'EUR',
);
$convertedMoney->__toString(); // (EUR) 88.84
You can also convert against historical rates and override the rounding mode:
use Carbon\Carbon;
$convertedMoney = Forex::convert(
money: Money::of(100, 'USD'),
currency: 'EUR',
roundingMode: RoundingMode::Down,
date: Carbon::create(2022, 4, 25),
);
By default, rates are cached according to your configuration. To bypass the cache and fetch fresh data:
// Refresh latest rates
Forex::refreshLatest('USD');
// Refresh historical rates
Forex::refreshRates(Carbon::create(2022, 4, 25), 'USD');
The package ships with two ready-to-use connectors for exchangerate-api.com:
ExchangeRateApiFreeConnector — uses the free public endpoint. Rates are updated once a day and historical data is not supported.ExchangeRateApiConnector — uses the authenticated v6 API. Requires a token and supports historical rates.To use the paid connector, update your config:
use Elegantly\Forex\Integrations\ExchangeRateApi\ExchangeRateApiConnector;
'client' => ExchangeRateApiConnector::class,
And add your token to .env:
EXCHANGE_RATE_API_TOKEN=your-api-token
Want to use a different provider? Implement the ForexClient interface:
use Carbon\CarbonInterface;
use Elegantly\Forex\ForexClient;
class MyCustomForexClient implements ForexClient
{
public function latest(string $currency): array
{
// Return an associative array of currency code => rate
}
public function rates(CarbonInterface $date, string $currency): array
{
// Return historical rates for the given date
}
}
Then set it as the active client:
'client' => \App\Services\MyCustomForexClient::class,
The package uses Saloon's cache and rate-limit plugins to reduce API calls and avoid hitting provider limits.
expiry_seconds.every_seconds interval.Both features use the cache store configured in forex.php.
Run the test suite with:
composer test
Run the static analysis suite with:
composer analyse
Format the code with:
composer format
See the CHANGELOG for details on recent updates.
Contributions are welcome! Please read the CONTRIBUTING guide for details.
If you discover any security-related issues, please refer to our security policy.
This package is open-source software licensed under the MIT license.