如何在Laravel中获取货币汇率,Laravel Exchange Rates扩展包了解一下

2023-06-01 00:00:00 获取 扩展 如何在

有时,当您构建 Web 应用程序时,您可能需要一些功能来处理来自世界各地的不同货币。为了能够使用不同的货币,您需要找到汇率。

在本文中,我们将看看如何使用 Laravel Exchange Rates 包与 exchangeatesapi.io API 交互。我们还将了解如何使用它来获取最新或历史汇率并在不同货币之间转换货币价值。


安装

要开始使用 Laravel Exchange Rates 包,我们首先需要运行以下命令以使用 Composer 安装它:

composer require ashallendesign/laravel-exchange-rates

获取您的 API 密钥

现在我们已经安装了包,我们需要从 https://exchangeratesapi.io/pricing 获取一个 API 密钥。您可以免费注册或使用付费等级,具体取决于您需要访问哪些功能。


配置

您现在可以使用以下命令发布包的配置文件:

php artisan vendor:publish --provider="AshAllenDesign\LaravelExchangeRates\Providers\ExchangeRatesProvider"

你现在应该有一个新的 config/laravel-exchange-rates.php 文件。默认情况下,包的配置设置为通过 HTTP 发出请求。但是,如果您在生产环境中并使用 API 的付费层之一,我强烈建议您改用 HTTPS。为此,您只需将配置文件更新为并将 api_url 字段更改为以 https:// 而不是 http:// 开头:

return [
    // ...
    'api_url' => env('EXCHANGE_RATES_API_URL', 'http://api.exchangeratesapi.io/v1/'),
    // ...
];

您还需要确保将 API 密钥添加到 .env 中:

EXCHANGE_RATES_API_KEY={Your-API-Key-Here}

获取单个日期的汇率

要将一种货币兑换成另一种货币,我们可以使用包的 ->exchangeRate() 方法。

如果我们想得到今天的汇率从“GBP”到“EUR”,我们可以这样写:

$exchangeRates = new ExchangeRate();
$result = $exchangeRates->exchangeRate('GBP', 'EUR');
// $result: '1.10086'

但是,如果我们想获得特定日期的交换,我们可以传递我们想要的日期的 Carbon 日期对象。

例如,如果我们想获得 2021 年 1 月 1 日从“GBP”到“EUR”的汇率,我们可以使用以下命令:

$exchangeRates = new ExchangeRate();
$result = $exchangeRates->exchangeRate('GBP', 'EUR', Carbon::create('2021-01-01'));
// $result: '1.10086'


获取两个日期之间的汇率

如果我们想获得给定日期范围内两种货币之间的汇率,我们可以使用包的 ->exchangeRateBetweenDateRange() 方法。

假设我们想要获得过去 3 天从“GBP”到“EUR”的汇率。我们可以这样写我们的代码:

$exchangeRates = new ExchangeRate();
$result = $exchangeRates->exchangeRateBetweenDateRange(
    'GBP',
    'EUR',
    Carbon::now()->subDays(3),
    Carbon::now(),
);
// $result: [
//     '2021-07-07' => 1.1092623405
//     '2021-07-08' => 1.1120625424
//     '2021-07-09' => 1.1153867604
// ];


单个日期的货币转换

该软件包不仅允许我们获取货币之间的汇率,还允许我们将货币价值从一种货币转换为另一种货币。为此,我们可以使用 ->convert() 方法。

例如,我们可以按照今天的汇率将 1 英镑“英镑”转换为“欧元”:

$exchangeRates = new ExchangeRate();
$result = $exchangeRates->convert(100, 'GBP', 'EUR', Carbon::now());
// $result: 110.15884906

您可能已经注意到我们传递了 100 作为第一个参数。这是因为该套餐要求我们以最低面额的货币传递货币价值。例如,在本例中,我们想转换 1 英镑,因此我们通过了 100,因为 1 英镑等于 100 便士。


在两个日期之间转换货币

与获取日期范围之间的汇率类似,您还可以使用该包将货币值从一种货币转换为另一种货币。为此,我们可以使用 ->convertBetweenDateRange() 方法。

假设我们想使用过去 3 天的汇率将 1 英镑“英镑”转换为“欧元”。我们可以这样写我们的代码:

$exchangeRates = new ExchangeRate();
$exchangeRates->convertBetweenDateRange(
    100,
    'GBP',
    'EUR',
    Carbon::now()->subDays(3),
    Carbon::now()
);
// $result: [
//     '2020-07-07' => 110.92623405,
//     '2020-07-08' => 111.20625424,
//     '2020-07-09' => 111.53867604,
// ];


通过使用包的缓存来提高性能

默认情况下,来自 exchangeatesapi.io API 的所有 API 响应都由包缓存。 这可以显着提高性能并减少服务器的带宽。 这也是有益的,因为如果您过去已经获取了汇率,它可以阻止您使用某些每月的 API 请求。


但是,如果出于任何原因您需要来自 API 的新结果而不是缓存结果,pacakge 提供了一个 ->shoudBustCache() 方法,我们可以使用它。

让我们看看如何从 API 获取新的汇率并忽略任何缓存的汇率:

$exchangeRates = new ExchangeRate();
$exchangeRates->shoudBustCache()->convert(100, 'GBP', 'EUR', Carbon::now());


使用包的验证规则

有时您可能会允许您的用户选择要转换的货币。在这种情况下,请务必确保您的用户只能输入 Exchange Rates API 支持的货币。

为了解决这个问题,Laravel Exchange Rates 附带了自己的 ValidCurrency 规则来验证货币。

假设我们有一个表单请求,用于验证请求中发送的货币。我们的表单请求可能看起来像这样:

<?php
namespace App\Http\Requests;
use AshAllenDesign\LaravelExchangeRates\Rules\ValidCurrency;
use Illuminate\Foundation\Http\FormRequest;
class MyAwesomeRequest extends FormRequest
{
    // ...
    public function rules(): array
    {
        return [
            'currency' => ['required', new ValidCurrency()],
        ];
    }
    // ...
}


测试

如果您正在为处理 Laravel Exchange Rates 包的代码编写测试,您可能希望阻止任何实际发出的 API 请求。出于这个原因,您可能希望使用依赖注入或使用包提供的外观来实例化 ExchangeRate 类。事实上,如果你有兴趣阅读更多关于这种类型的东西,我建议你阅读我的如何让你的 Laravel 应用程序更具可测试性的文章。

让我们快速了解一下如何为控制器方法编写基本测试,该方法将今天的汇率从“GBP”转换为“EUR”。我们的控制器可能看起来像这样:

use AshAllenDesign\LaravelExchangeRates\Classes\ExchangeRate;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class MyAwesomeController extends Controller
{
    public function __invoke(Request $request, ExchangeRate $exchangeRate): JsonResponse
    {
        $rate = $exchangeRates->exchangeRate('GBP', 'EUR');
        return response()->json(['rate' => $rate]);
    }
}

现在,让我们为这个控制器方法编写一个测试。我们将假设该方法的路由名称是 awesome.route。

我们的测试可能如下所示:

use AshAllenDesign\LaravelExchangeRates\Classes\ExchangeRate;
use Mockery\MockInterface;
use Tests\TestCase;
class MyAwesomeControllerTest extends TestCase
{
    /** @test */
    public function success_response_is_returned(): void
    {
        // Create the mock of the service class.
        $this->mock(ExchangeRate::class, function (MockInterface $mock): void {
            $mock->shouldReceive('exchangeRate')
                ->once()
                ->withArgs(['GBP', 'EUR'])
                ->andReturn(123.456);
        });
        $this->postJson(route('awesome.route'))
            ->assertExactJson([
                'rate' => 123.456
            ]);
    }
}


结论

希望本文已经向您展示了如何使用 Laravel Exchange Rates 包与 Exchange Rates API 交互以获取汇率和货币换算。 它还应该让您简要了解如何为使用该包的代码编写测试。

如果这篇文章对你有帮助,我很想听听。 同样,如果您有任何反馈来改进这篇文章,我也很乐意听到。


转:

https://dev.to/ashallendesign/how-to-get-currency-exchange-rates-in-laravel-5548

相关文章