Der in diesem Artikel mit Ihnen geteilte Inhalt ist eine ausführliche Analyse (Code) der Laravel-Pipeline. Freunde in Not können sich darauf beziehen.
Grundsätzlich können Sie Laravel-Pipelines verwenden, um Objekte an mehrere Klassen zu übergeben, um jede Art von Aufgaben basierend auf Kettenoperationen auszuführen, und die Endergebnisse auf einmal zurückzugeben, nachdem alle „Aufgaben“ abgeschlossen sind.
Das häufigste Beispiel für die Funktionsweise von Management ist die Verwendung innerhalb von Komponenten des Frameworks selbst. Ich spreche hier von „Middleware“.
Middleware bietet einen praktischen Mechanismus zum Filtern von HTTP-Anfragen, die an Ihre Anwendung gesendet werden...
Hier ist ein einfaches Middleware-Beispiel:
<?php namespace App\Http\Middleware; use Closure; class TestMiddleware { /** * 处理请求 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // 在这里加入你的代码 return $next($request); } }
Diese „Middleware“ ist eigentlich eine Pipeline, die die zur Ausführung erforderlichen Aufgaben erledigt, indem sie eingehende Anfragen entgegennimmt. Hier können Sie erkennen, ob es sich bei der aktuell akzeptierten Anfrage um eine HTTP-Anfrage, eine JSON-Anfrage oder eine beliebige Benutzerauthentifizierung usw. handelt.
Wenn Sie einen kurzen Blick auf die Klasse IlluminateFoundationHttpKernel werfen, sehen Sie, wie Middleware im Objekt Pipeline ausgeführt wird.
/** * 将请求传入到指定的 中间件/路由。 * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ protected function sendRequestThroughRouter($request) { $this->app->instance('request', $request); Facade::clearResolvedInstance('request'); $this->bootstrap(); return (new Pipeline($this->app)) ->send($request) ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware) ->then($this->dispatchToRouter()); }
Sie können diesem Code entnehmen: Die Pipeline-Instanz sendet die Anfrage an eine Reihe von Middleware und verteilt sie an den Router.
Machen Sie sich keine Sorgen, wenn Ihnen dieser Code etwas verwirrend erscheint. Ich werde die zugehörigen Konzepte anhand einiger Beispiele veranschaulichen.
Stellen Sie sich dieses Szenario vor. Wir müssen ein Forensystem erstellen, das es Benutzern ermöglicht, Themen zu erstellen und Nachrichten zu hinterlassen. Der Client verlangt jedoch, dass Sie Tags automatisch löschen, wenn sie erstellt oder bearbeitet werden.
Das müssen Sie tun:
Ersetzen Sie das Link-Tag im Text.
Verwenden Sie „*“, um sensible Wörter zu ersetzen.
Skript-Tags aus Text entfernen.
Vielleicht werden Sie irgendwann verwandte Klassen erstellen, um diese „Aufgaben“ zu bewältigen.
$pipes = [ RemoveBadWords::class ReplaceLinkTags::clas RemoveScriptTags::class ];
Was wir tun müssen, ist, unseren „Inhalt“ der Reihe nach an jede Aufgabe weiterzugeben und dann die Verarbeitungsergebnisse der vorherigen Aufgabe an die nächste Aufgabe weiterzugeben. Wir können Pipes verwenden, um diese Aufgabe zu erledigen.
public function create(Request $request) { $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); }); // 返回响应 }
Jede „Aufgabe“-Klasse muss eine „Handle“-Methode definieren, um Funktionen zu verarbeiten. Vielleicht ist die Programmierung durch die Implementierung einer Schnittstelle eine gute Idee:
<?php namespace App; use Closure; interface Pipe { public function handle($content, Closure $next); }
Benennung ist so schwer ¯_(ツ)_/¯*
<?php namespace App; use Closure; class RemoveBadWords implements Pipe { public function handle($content, Closure $next) { // 在这里处理任务,返回待更新的 **$content** 给到下一个管道任务。 return $next($content); } }
Die zur Bearbeitung der Aufgabe verwendete Methode erhält zwei Parameter: Der erste ist ein passierbares Objekt und der zweite ist der Abschluss, zu dem das Objekt nach dem Ausführen der letzten Pipeline umgeleitet wird.
Sie können auch den Methodennamen anpassen, um den Methodennamen „Handle“ zu ersetzen. Dann müssen Sie den Methodennamen angeben, der von der Pipeline verwendet werden soll, etwa so:
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- 就是这个 :) ->then(function ($content) { return Post::create(['content' => $content]); });
Was sollte hier passieren? dass der Inhalt des Commits durch jede $pipes geändert wird und der endgültig zurückgegebene Inhalt gespeichert wird.
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); });
Denken Sie daran, dass es viele Möglichkeiten gibt, mit dieser Art von Problem umzugehen. Wie Sie sich entscheiden, bleibt Ihnen überlassen. Seien Sie aber froh, wenn Sie das Wissen über diese neue Waffe bereits in Ihrer Wissensdatenbank haben, wenn Sie es brauchen.
Ich hoffe, dass dieses Beispiel Ihnen ein tieferes Verständnis von „Laravel Pipelines“ und ihrer Verwendung vermitteln kann.
Sie können sich auch die Laravel-API-Dokumentation ansehen, wenn Sie mehr über die Funktionsweise erfahren möchten
Verwandte Empfehlungen:
Erstellen Sie selbst eine Laravel Docker-Entwicklungsumgebung Methoden
Das obige ist der detaillierte Inhalt vonEingehende Analyse der Laravel-Pipeline (Code). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!