• Время чтения ~1 мин
  • 11.02.2024

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

.Фото FOCA Stock на StockSnap

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

Про мене

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

Об авторе CrazyBoy49z
WORK EXPERIENCE
Контакты
Ukraine, Lutsk
+380979856297