Ось маленька порада, яку я виявив, і яку я ніде не бачив задокументованої. Ви можете використовувати when() і unless() з клієнтом Laravel Http.
Ось приклад методу, який використовує Http-клієнт Laravel.
use Illuminate\Support\Facades\Http;
public function getUser(int $id): array
{
$response = Http::baseUrl('https://example.com/api')
->get("user/{$id}")
->throw()
->json();
return $response;
}
А тепер уявіть, що ми хочемо передати токен, який надсилається як заголовок.
use Illuminate\Support\Facades\Http;
public function getUser(int $id, string $token): array
{
$response = Http::baseUrl('https://example.com/api')
->withHeader('X-Token', $token)
->get("user/{$id}")
->throw()
->json();
return $response;
}
Клієнт HTTP робить це дуже простим за допомогою методу ->withHeader()
.
Але що станеться, якщо токен стане необов'язковим для деяких викликів? Комусь це потрібно, а комусь ні?
Що ж, ми можемо скопіювати весь метод і продублювати весь наш код, або ми можемо використовувати ->when()
.
Якщо ви подивитеся на клас PendingRequest, то побачите, що він використовує цю Illuminate\Support\Traits\Conditionable
ознаку. Ця ознака дає йому доступ як до when(), так і до unless().
Тут ми встановлюємо токен як необов'язковий параметр. Коли він передається, when() вирішується як true, а потім додає замикання.
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\PendingRequest;
public function getUser(int $id, ?string $token = null): array
{
$response = Http::baseUrl('https://example.com/api')
->when($token, function (PendingRequest $request) {
$request->withHeader('X-Token', $token);
})
->get("user/{$id}")
->throw()
->json();
return $response;
}
Ви також можете встановити метод за замовчуванням, якщо вам потрібно, який запускається, коли when() вирішується як false. Прикладом може бути встановлення токена за замовчуванням у заголовку, якщо його не надано.
use Illuminate\Support\Facades\Http;
use Illuminate\Http\Client\PendingRequest;
public function getUser(int $id, ?string $token = null): array
{
$response = Http::baseUrl('https://example.com/api')
->when($token, function (PendingRequest $request) {
$request->withHeader('X-Token', $token);
}, function (PendingRequest $request) {
$request->withHeader('X-Token', 'default-value');
})
->get("user/{$id}")
->throw()
->json();
return $response;
}