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.
- Features
- Requirements
- Installation
- Configuration
- Usage
- Providers
- Caching & Rate Limiting
- Testing
- Changelog
- Contributing
- Security
- Credits
- License
- Retrieve latest exchange rates for any base currency.
- Retrieve historical exchange rates for a specific date.
- Convert
Moneyinstances between currencies with high precision usingbrick/money. - Built-in caching and optional rate limiting to keep API usage under control.
- Swap the default provider with a custom implementation via a simple interface.
- PHP
^8.3 - Laravel
^13.0
Install the package via Composer:
composer require elegantly/laravel-forexPublish 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.84You 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-tokenWant 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.
- Caching is enabled by default and stores responses for the configured
expiry_seconds. - Rate limiting is disabled by default. Enable it to throttle requests to one per
every_secondsinterval.
Both features use the cache store configured in forex.php.
Run the test suite with:
composer testRun the static analysis suite with:
composer analyseFormat the code with:
composer formatSee 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.