Вот небольшой совет, который я обнаружил, но нигде не видел задокументированного. Вы можете использовать when() и unless() с HTTP-клиентом Laravel.
Ниже приведен пример метода, использующего 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;
}