Heim  >  Artikel  >  PHP-Framework  >  Erfahren Sie in einem Artikel mehr über Pipeline in Laravel

Erfahren Sie in einem Artikel mehr über Pipeline in Laravel

青灯夜游
青灯夜游nach vorne
2022-11-16 20:49:571767Durchsuche

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!

Erfahren Sie in einem Artikel mehr über Pipeline in Laravel

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(&#39;request&#39;, $request);
    Facade::clearResolvedInstance(&#39;request&#39;);
    $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([&#39;content&#39; => &#39;content&#39;]);
        });
    // 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(&#39;customMethodName&#39;) // <---- This one :)
 ->then(function ($content) {
     return Post::create([&#39;content&#39; => $content]);
 });

最后产生的效果是什么 ?

提交的内容将会被各个$pipes

$post = app(Pipeline::class)
    ->send($request->all())
    ->through($pipes)
    ->then(function ($content) {
        return Post::create([&#39;content&#39; => $content]);
    });

Sie können im Code so etwas sehen: eine neue Pipe, die die Anfrage durch eine Liste von Middlewares sendet und dann die Route sendet.

Machen Sie sich keine Sorgen, wenn Ihnen das etwas überwältigend vorkommt. Versuchen wir, dieses Konzept anhand des folgenden Beispiels zu verdeutlichen.

Umgang mit der Multitasking-Laufklasse

Lassen Sie uns einen Blick darauf werfen Art Szene. Nehmen wir an, Sie richten ein Forum ein, in dem Leute Beiträge posten und kommentieren können. Ihre Benutzer verlangen jedoch, dass Sie automatisch Tags entfernen oder Tags für jeden Inhalt bearbeiten, während dieser erstellt wird.

Was Sie an dieser Stelle tun müssen, ist Folgendes:
  • Ersetzen Sie das Link-Tag durch einfachen Text;

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

Entfernen Sie Skript-Tags vollständig aus dem Inhalt.

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

🎜Was ist der Endeffekt?🎜🎜🎜 Der übermittelte Inhalt wird von jedem $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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen