• Czas czytania ~1 min
  • 11.02.2024

Oto mała wskazówka, którą odkryłem, a której nigdzie nie widziałem. Możesz użyć when() i unless() z klientem Laravel Http.

Oto przykładowa metoda, która wykorzystuje klienta Laravel Http.

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;
}

Teraz wyobraźmy sobie, że chcemy przekazać token, który jest wysyłany jako nagłówek.

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;
}

Klient Http sprawia, że jest to bardzo łatwe przy użyciu ->withHeader() tej metody.

Ale co się stanie, jeśli token jest opcjonalny dla niektórych wywołań? Niektóre prośby tego potrzebują, a inne nie?

Cóż, możemy skopiować całą metodę i zduplikować cały nasz kod lub skorzystać z ->when().

Jeśli przyjrzysz się klasie PendingRequest, zobaczysz, że korzysta ona z Illuminate\Support\Traits\Conditionable cechy. Ta cecha daje mu dostęp zarówno do when(), jak i unless().

W tym miejscu ustawiamy token jako parametr opcjonalny. Po przekazaniu when() jest rozpoznawana jako true, a następnie dodaje domknięcie.

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;
}

W razie potrzeby można również ustawić metodę domyślną, która będzie uruchamiana, gdy when() zostanie rozpoznana jako false. Przykładem może być ustawienie domyślnego tokenu w nagłówku, jeśli nie zostanie podany.

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;
}

Zdjęcie autorstwa FOCA Stock na StockSnap

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

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...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297