Einführung
Wenn Sie eine API in Laravel erstellen, ist es wahrscheinlich, dass Sie Antworten ausgeben sollten, um Erfolgs- oder Fehlermeldungen anzuzeigen. Was wäre, wenn Sie diese Antworten standardisieren könnten und nicht in jedem einzelnen Controller json-Antworten wiederholen müssten. Glücklicherweise hat Laravel jetzt eine Responsable-Schnittstelle, die es einfach ermöglicht, ein Objekt in eine Antwort zu konvertieren.
Zuvor mussten wir für alle Endpunkte separate Antworten schreiben. Im Folgenden sehen Sie beispielsweise den Endpunkt für die Erstellung einer Lektion, bei dem wir den Titel aus der Anfrage des Benutzers erhalten.
Lesen Sie auch: Livewire Kommentare Open Source
Endpunkt:{{base_url}}/api/lessons
try {
$lesson = App\Models\Lesson::create($request->title);
} catch (Throwable $e) {
return response()->json([
'message' => 'failed to create lesson'
]);
}
return response()->json([
'message' => 'lesson created successfully'
]);
Mit Laravel Responsable können alle API-Antworten standardisiert werden und werden die gleiche Art von Erfolgs- oder Fehler-Json-Antworten verwenden. Um dies zu erreichen, können Sie einfach zwei Response-Klassen für Erfolg und Fehler erstellen und diese Klassen von überall in der App zurückgeben.
Lesen Sie auch: Laravel-App mit Envoy bereitstellen
API-Erfolgsantwort
<?php
namespace App\Http\Responses;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\Response;
class ApiSuccessResponse implements Responsable
{
/**
* @param mixed $data
* @param array $metaData
* @param int $code
* @param array $headers
*/
public function __construct(
protected mixed $data,
protected array $metaData,
protected int $code = Response::HTTP_OK,
protected array $headers = []
) {
}
/**
* @param $request
* @return \Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
*/
public function toResponse($request)
{
return response()->json([
'data' => $this->data,
'metadata' => $this->metaData
], $this->code, $this->headers);
}
}
API Error Response
<?php
namespace App\Http\Responses;
use Illuminate\Contracts\Support\Responsable;
use Illuminate\Http\Response;
use Throwable;
class ApiErrorResponse implements Responsable
{
/**
* @param Throwable $e
* @param string $message
* @param int $code
* @param array $headers
*/
public function __construct(
protected Throwable $e,
protected string $message,
protected int $code = Response::HTTP_INTERNAL_SERVER_ERROR,
protected array $headers = []
) {
}
/**
* @param $request
* @return \Illuminate\Http\JsonResponse|\Symfony\Component\HttpFoundation\Response
*/
public function toResponse($request)
{
$response = ['message' => $this->message];
if ($this->e && config('app.debug')) {
$response['debug'] = [
'message' => $this->e->getMessage(),
'file' => $this->e->getFile(),
'line' => $this->e->getLine(),
'trace' => $this->e->getTrace()
];
}
return \response()->json($response, $this->code, $this->headers);
}
}
Schließlich
Wir können unsere API-Antworten mithilfe der oben genannten Klassen vereinfachen und standardisieren. Sie können nun einfach diese Klassen zurückgeben und die Parameter nach Ihren API-Bedürfnissen übergeben.
Lesen Sie auch: Code-Formatierung mit Laravel Pint
try {
$lesson = App\Models\Lesson::create($request->title);
} catch (Throwable $e) {
return new \App\Http\Responses\ApiErrorResponse($e, 'failed to create lesson', 500);
}
return new \App\Http\Responses\ApiSuccessResponse($lesson,
['message' => 'lesson created successfully'],
201
);
Lesen Sie auch: Eine zu vielen polymorphen Beziehungen in Laravel