侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Laravel  /  管理员 发布于 3年前   1170

有时,当您构建 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

  • 上一条:
    国内Gin框架安装问题,go get方式安装超时解决方法
    下一条:
    Laravel Site Search(私人Google搜索),通过它抓取您的网站创建全文搜索索引
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel 11.15版本发布 - Eloquent Builder中添加的泛型(0个评论)
    • Laravel 11.14版本发布 - 新的字符串助手和ServeCommand改进(0个评论)
    • Laravel 11.12版本发布 - Artisan的`make`命令自动剪切`.php `扩展(0个评论)
    • Laravel的轻量型购物车扩展包:binafy/laravel-cart(0个评论)
    • Laravel 11.11版本发布 - 查看模型中的第三方关系:show(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-01
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客