jenky / transmit
Laravel HTTP 客户端管理器
Requires
- php: ^7.2.5|^8.0
- guzzlehttp/guzzle: ^6.3|^7.0
- illuminate/config: ^7.0|^8.0|^9.0
- illuminate/container: ^7.0|^8.0|^9.0
- illuminate/http: ^7.0|^8.0|^9.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- orchestra/testbench: ^5.0|^6.0|^7.0
- phpunit/phpunit: ^8.0|^9.0
README
此包允许您快速创建具有预定义配置的 HTTP 客户端。
安装
您可以使用 Composer 将 Transmit 安装到您的 Laravel 项目中
$ composer require jenky/transmit
安装 Transmit 后,使用 vendor:publish
Artisan 命令发布其资产。
php artisan vendor:publish
或
php artisan vendor:publish --provider="Jenky\Transmit\TransmitServiceProvider"
配置
发布 Transmit 的资产后,其主配置文件将位于 config/transmit.php
。此配置文件允许您配置您的 Guzzle 客户端选项,每个配置选项都包括其目的的描述,因此请确保彻底探索此文件。
客户端配置
客户端只是一个具有自己配置的 HTTP 客户端实例。这允许您随时随地在需要的地方创建 HTTP 客户端并重复使用。
配置选项
在通道中设置 Guzzle 请求选项。有关更多信息,请访问 请求选项。
'clients' => [ 'github' => [ 'options' => [ 'base_uri' => 'https://api.github.com/v3/', 'time_out' => 20, ], ], ]
然后在您的代码中使用它
use Illuminate\Support\Facades\Http; Http::client('github')->get('....');
自定义客户端挂起请求
要开始,在通道的配置中定义一个 tap
数组。该 tap
数组应包含一个类列表,这些类应有机会在创建后自定义(或“获取”挂起的请求实例)
'default' => [ 'tap' => [ App\Http\Client\CustomizeRequest::class, ], ],
一旦您已为您客户端配置了 tap
选项,您就可以定义将自定义客户端工厂实例的类。此类只需要一个方法:__invoke
,它接收一个 Illuminate\Http\Client\PendingRequest
实例。
<?php namespace App\Http\Client; use Illuminate\Http\Client\PendingRequest; class CustomizeRequest { /** * Customize the given client pending request instance. * * @param \Illuminate\Http\Client\PendingRequest $request * @return void */ public function __invoke(PendingRequest $request) { $request->withToken('my_access_token'); } }
所有“tap”类都由服务容器解析,因此它们所需的任何构造函数依赖项将自动注入。
"Tap" 类参数
"Tap" 类还可以接收额外的参数。例如,如果您的处理程序需要使用特定的 Laravel 日志记录通道记录 Guzzle 请求和响应,则可以创建一个接收通道名称作为额外参数的 UseLogger
类。
额外参数将在 $request
参数之后传递给类
<?php namespace App\Http\Client; use GuzzleHttp\MessageFormatter; use GuzzleHttp\Middleware; use Illuminate\Http\Client\PendingRequest; use Illuminate\Log\LogManager; class UseLogger { /** * The logger manager instance. * * @var \Illuminate\Log\LogManager */ protected $logger; /** * Create new log middleware instance. * * @param \Illuminate\Log\LogManager $logger * @return void */ public function __construct(LogManager $logger) { $this->logger = $logger; } /** * Customize the given client pending request instance. * * @param \Illuminate\Http\Client\PendingRequest $request * @param string|null $channel * @param string $level * @return void */ public function __invoke(PendingRequest $request, ?string $channel = null, string $level = 'debug') { $request->withMiddleware(Middleware::log( $this->logger->channel($channel), new MessageFormatter, $level )); } }
"Tap" 类参数可以在 transmit
配置中指定,通过在类名和参数之间使用 :
分隔。多个参数应由逗号分隔
'my_client' => [ 'tap' => [ App\Http\Client\UseLogger::class.':slack,info', ], ],
如果您不想使用基于类的方法定义,也可以使用 closure
'my_client' => [ 'tap' => [ function (PendingRequest $request) { $request->asForm(); }, ], ],
注意事项
检查模拟请求
如果请求是从特定客户端发出的,则应从 HTTP 客户端实例而不是 Http
门面调用所有 assert*
方法。
use Illuminate\Http\Client\Request; use Illuminate\Support\Facades\Http; Http::fake(); Http::client('my_client')->get('foo'); Http::client('my_client')->assertSent(function (Request $request) { // }); Http::client('my_client')->assertNotSent(function (Request $request) { // });
更改日志
请参阅 CHANGELOG 了解最近的变化。
测试
$ composer test
贡献
有关详细信息,请参阅 CONTRIBUTING 和 CODE_OF_CONDUCT。
安全性
如果您发现任何与安全相关的问题,请通过电子邮件 contact@lynh.me 联系我们,而不是使用问题跟踪器。
致谢
许可
MIT 许可证 (MIT)。有关更多信息,请参阅 许可文件。