Eingehende Analyse der Laravel-Pipeline (Code)

不言
Freigeben: 2023-04-03 10:48:02
Original
1284 Leute haben es durchsucht

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);
    }
}
Nach dem Login kopieren

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());
}
Nach dem Login kopieren

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.

Arbeiten an einem Kurs, der die Ausführung mehrerer Aufgaben erfordert

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:

  1. Ersetzen Sie das Link-Tag im Text.

  2. Verwenden Sie „*“, um sensible Wörter zu ersetzen.

  3. 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
];
Nach dem Login kopieren

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

    // 返回响应
}
Nach dem Login kopieren

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);
}
Nach dem Login kopieren
  • Benennung ist so schwer ¯_(ツ)_/¯*

<?php

namespace App;

use Closure;

class RemoveBadWords implements Pipe
{
    public function handle($content, Closure $next)
    {
        // 在这里处理任务,返回待更新的 **$content** 给到下一个管道任务。
        return  $next($content);
    }
}
Nach dem Login kopieren

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]);
 });
Nach dem Login kopieren

Was passiert am Ende? (Was passiert am Ende?)

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]);
    });
Nach dem Login kopieren

Abschließende Worte

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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!