Angenommen, ich möchte eine RESTful-API für externe Geräte wie Android erstellen und gleichzeitig diese API mithilfe von Webrouten und Blade-Vorlagen verwenden.

Route: api / articles / {id} / edit

public function API_edit(Article $article)
{
    $article->body = request('body');
    $article->save();

    return response()->json([...]);
}

Hier ist die Sache. Was soll ich tun, um mich nicht zu wiederholen? Weil ich denke, dass es nicht in Ordnung ist, eine andere Methode zu erstellen, die im Grunde dasselbe wie API_edit macht.

Route: Artikel / {id} / bearbeiten

public function edit(Article $article)
{
    $article->body = request('body');
    $article->save();

    return redirect()->back()->with(['message' => 'Article edited']);
}

Das muss falsch sein, es ist ein einfaches Beispiel, aber was ist, wenn die Logik komplexer ist? Es fühlt sich nicht richtig an.

1
bruno-alod 22 Feb. 2020 im 23:59

3 Antworten

Schauen Sie sich diesen Beitrag an, wenn ich Ihre Frage richtig verstehe () Laravel Web- und API-Controller-Struktur. Separate vs DRY ).

Sie müssen die Routen für beide einrichten und "duplizieren", wenn Sie sie in einer RESTful-API für ein externes Framework wie Vue / Angular oder einen externen Dienst verwenden, und diese Routen müssen auch intern innerhalb von web.php verarbeitet werden die interne Anfrage bearbeiten.

Sie können diese Anforderungen jedoch weiterhin auf denselben Controller verweisen.

Wie folgt:

web.php

Route::get('/some/web/request', 'YourController@function')

api.php

Route::get('/some/api/request', 'YourController@function');
0
Tanner 23 Feb. 2020 im 02:35

Sie können die wantJson-Methode von \ Illuminate \ Support \ Facades \ Request facade verwenden, um Folgendes zu überprüfen:

public function edit(Article $article)
{
    $article->body = request('body');
    $article->save();
    $response = ['message' => 'Article edited'];

    if (Request::wantsJson()) {
        return response()->json($response);
    }

    return redirect()->back()->with($response);
}
0
Ruben Danielyan 22 Feb. 2020 im 21:19

In diesem Fall ist das wahrscheinlich genau das, was Sie tun sollten. Wie Sie sagen, könnte die Logik komplexer sein. In diesem Fall sollten Sie sie wahrscheinlich nicht in Ihrem Controller belassen, unabhängig von der Wiederverwendung über Web- / API-Routen hinweg. Wenn die Aktion, die Ihr Controller ausführen muss, komplex ist, extrahieren Sie sie in einen Dienst.

0
Calum Halpin 22 Feb. 2020 im 21:07