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