Dieser Artikel wird Ihnen helfen, die Pipeline in Laravel zu verstehen und über das Pipeline-Design-Paradigma zu sprechen. Ich hoffe, dass er Ihnen hilfreich sein wird!
Im Allgemeinen können Sie durch die Verwendung von Pipes in Laravel ein Objekt reibungslos zwischen mehreren Klassen übergeben, um jede Art von Aufgabe auszuführen. Sobald alle Aufgaben ausgeführt wurden, geben Sie den Ergebniswert zurück.
Als nächstes erfahren Sie mehr über Laravel-Pipelines.
In Bezug auf die Art und Weise, wie die Pipeline ausgeführt wird, ist das offensichtlichste Beispiel tatsächlich eine der am häufigsten verwendeten Komponenten im Framework selbst. Ja, ich spreche von Middleware.
Middleware bietet einen praktischen Mechanismus zum Filtern von HTTP-Anfragen, die in Ihre Anwendung eingehen.
Eine grundlegende Middleware sollte so aussehen:
<?php namespace App\Http\Middleware; use Closure; class TestMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { // Here you can add your code return $next($request); } }
Bei dieser „Middleware“ handelt es sich eigentlich um Pipelines, über die Anfragen gesendet werden, um alle erforderlichen Aufgaben auszuführen. Hier können Sie prüfen, ob es sich bei der Anfrage um eine HTTP-Anfrage handelt, ob es sich um eine JSON-Anfrage handelt, ob authentifizierte Benutzerinformationen vorliegen usw.
Wenn Sie einen kurzen Blick auf die Klasse IlluminateFoundationHttpKernel
werfen möchten, werden Sie sehen, wie Sie eine neue Instanz der Klasse Pipeline
zum Ausführen von Middleware verwenden. IlluminateFoundationHttpKernel
类, 你将看到如何使用 Pipeline
类的新实例来执行中间件。
/** * Send the given request through the middleware / router. * * @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()); }
你可以在代码中看到类似的内容:通过中间件列表发送请求的新管道,然后发送路由。
如果这让你看起来有点不知所措也不用担心。让我们试着用以下这个例子来阐明这个概念。
让我们来看一种场景。 比方说,你建立了一个人们可以发帖并发表评论的论坛。但是,您的用户请求您自动删除标签或在创建时在每一个内容上编辑标签。
此时你被要求做的事情如下:
用纯文本替换链接标记;
用“*”替换敏感词;
从内容中完全删除脚本标记。
可能你最终会创建类来处理这些 “tasks”。
$pipes = [ RemoveBadWords::class ReplaceLinkTags::class RemoveScriptTags::class ];
我们要做的是将给定的“内容”传递给每个任务,然后将结果返回给下一个任务。我们可以使用pipeline来做到这一点。
<?php public function create(Request $request) { $pipes = [ RemoveBadWords::class, ReplaceLinkTags::class, RemoveScriptTags::class ]; $post = app(Pipeline::class) ->send($request->content) ->through($pipes) ->then(function ($content) { return Post::create(['content' => 'content']); }); // return any type of response }
每个“task”类应该有一个“handle”方法来执行操作。也许每个类都有统一的约束是一个不错的选择:
<?php namespace App; use Closure; interface Pipe { public function handle($content, Closure $next); }
命名是个困难的事情 ¯_(ツ)_/¯
<?php namespace App; use Closure; class RemoveBadWords implements Pipe { public function handle($content, Closure $next) { // Here you perform the task and return the updated $content // to the next pipe return $next($content); } }
用于执行任务的方法应该接收两个参数,第一个参数是合格的对象,第二个参数是当前操作处理完后会接管的下一个闭包(匿名函数)。
您可以使用自定义方法名称而不是“handle”。然后你需要指定pipeline要使用的方法名称,比如:
app(Pipeline::class) ->send($content) ->through($pipes) ->via('customMethodName') // <---- This one :) ->then(function ($content) { return Post::create(['content' => $content]); });
提交的内容将会被各个$pipes
$post = app(Pipeline::class) ->send($request->all()) ->through($pipes) ->then(function ($content) { return Post::create(['content' => $content]); });
Entfernen Sie Skript-Tags vollständig aus dem Inhalt.
Ersetzen Sie das Link-Tag durch einfachen Text;
Verwenden Sie „*“, um sensible Wörter zu ersetzen.
Vielleicht erstellen Sie am Ende Klassen, um diese „Aufgaben“ zu bewältigen. rrreee
Was wir tun wollen, ist, den gegebenen „Inhalt“ an jede Aufgabe zu übergeben und das Ergebnis dann an die nächste Aufgabe zurückzugeben. Dazu können wir die Pipeline verwenden. 🎜rrreee🎜Jede „Aufgabe“-Klasse sollte eine „Handle“-Methode zum Ausführen von Operationen haben. Vielleicht wäre es eine gute Wahl, einheitliche Einschränkungen für jede Klasse zu haben: 🎜rrreee🎜🎜🎜Benennung ist eine schwierige Sache ¯_(ツ)_/¯🎜🎜🎜rrreee🎜Die zur Ausführung der Aufgabe verwendete Methode sollte zwei Parameter erhalten: Der erste Parameter ist das qualifizierte Objekt und der zweite Parameter ist der nächste Abschluss (anonyme Funktion), der nach der Verarbeitung der aktuellen Operation übernommen wird. 🎜🎜Sie können anstelle von „Handle“ einen benutzerdefinierten Methodennamen verwenden. Anschließend müssen Sie den Methodennamen angeben, der von der Pipeline verwendet werden soll, z. B.:🎜rrreee$pipes
verarbeitet und die verarbeiteten Ergebnisse werden gespeichert. 🎜rrreee🎜🎜🎜Epilog🎜🎜🎜🎜Denken Sie daran, es gibt viele Möglichkeiten, diese Art von Problem zu lösen. Wie Sie wählen, hängt von Ihrer eigenen Wahl ab. Seien Sie sich nur darüber im Klaren, dass Sie dieses Tool bei Bedarf verwenden können. Ich hoffe, dieses Beispiel hat Ihnen ein besseres Verständnis der „Laravel-Pipelines“ und ihrer Verwendung vermittelt. Wenn Sie mehr wissen oder erfahren möchten, können Sie sich die API-Dokumentation von Laravel ansehen🎜laravel.com/api/5.4/Illuminate/Pip...🎜🎜🎜🎜Originaladresse: https://medium.com/@jeffochoa/understanding -laravel-pipelines-a7191f75c351🎜🎜Übersetzungsadresse: https://learnku.com/laravel/t/7543/pipeline-pipeline-design-paradigm-in-laravel🎜🎜🎜[Verwandte Empfehlungen: 🎜Laravel-Video-Tutorial🎜]🎜
Das obige ist der detaillierte Inhalt vonErfahren Sie in einem Artikel mehr über Pipeline in Laravel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!