Sprache:

Suche

Standardisierung von API-Antworten mit Laravel Responsables

  • Teilen:
Standardisierung von API-Antworten mit Laravel Responsables

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 

TWT Staff

TWT Staff

Writes about Programming, tech news, discuss programming topics for web developers (and Web designers), and talks about SEO tools and techniques