• Час читання ~1 хв
  • 11.02.2024

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

Фото 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