Laravelパイプライン(コード)の詳細な分析

不言
リリース: 2023-04-03 10:48:02
オリジナル
1309 人が閲覧しました

この記事で共有する内容は、Laravel パイプラインの詳細な分析 (コード) であり、一定の参考価値があります。必要な友人はそれを参照できます。

基本的に、laravel パイプラインを使用してオブジェクトを複数のクラスに渡し、チェーン操作に基づいてあらゆるタイプのタスクを実行し、すべての「タスク」が完了した後に最終結果を一度に返すことができます。

管理がどのように機能するかを示す最も一般的な例は、フレームワーク自体のコンポーネント内での管理の使用です。ここで私が話しているのは「ミドルウェア」です。

ミドルウェアは、アプリケーションに送信される HTTP リクエストをフィルタリングする便利なメカニズムを提供します...

これは基本的なミドルウェアの例です:

<?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);
    }
}
ログイン後にコピー

これらの " "ミドルウェア" は実際には受信リクエストを受け入れて実行に必要なタスクを処理するパイプライン。ここでは、現在受け入れられているリクエストが HTTP リクエスト、JSON リクエスト、またはユーザー認証などであるかどうかを検出できます。

Illuminate\Foundation\Http\Kernel クラスをざっと見てみると、Pipeline オブジェクトでミドルウェアがどのように実行されているかがわかります。

/**
  * 将请求传入到指定的 中间件/路由。

  * @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());
}
ログイン後にコピー

このコードからわかるように、パイプライン インスタンスはリクエストを一連のミドルウェアに送信し、それをルーターに配布します。

このコードが少しわかりにくいかもしれませんが、心配しないでください。関連する概念をいくつかの例で説明します。

クラス内で複数のタスクを実行する (複数のタスクを実行する必要があるクラスで作業する)

次のシナリオを考えてみましょう。ユーザーがトピックを作成してメッセージを残せるフォーラム システムを作成する必要があります。ただし、クライアントは、タグが作成または編集されたときにタグを自動的に削除することを要求します。

ここで行う必要があるのは次のとおりです:

  1. テキスト内のリンク タグを置き換えます。

  2. 機密性の高い単語を置き換えるには「*」を使用します。

  3. テキストからスクリプト タグを削除します。

最終的には、これらの「タスク」を処理する関連クラスを構築することになるでしょう。

$pipes = [
    RemoveBadWords::class
    ReplaceLinkTags::clas
    RemoveScriptTags::class
];
ログイン後にコピー

私たちがしなければならないことは、「コンテンツ」を各タスクに順番に渡し、前のタスクの処理結果を次のタスクに渡すことです。パイプを使用してこのタスクを処理できます。

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

    // 返回响应
}
ログイン後にコピー

各「タスク」クラスは、関数を処理するための「ハンドル」メソッドを定義する必要があります。おそらくインターフェイスを実装してプログラミングするのが良い考えでしょう:

<?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)
    {
        // 在这里处理任务,返回待更新的 **$content** 给到下一个管道任务。
        return  $next($content);
    }
}
ログイン後にコピー

タスクの処理に使用されるメソッドは 2 つのパラメータを受け取ります。1 つ目は通過可能なオブジェクトで、2 つ目は最後のパイプラインの実行後にオブジェクトがリダイレクトされるクロージャです。

メソッド名をカスタマイズして、「ハンドル」メソッド名を置き換えることもできます。次に、パイプラインで使用するメソッド名を次のように指定する必要があります:

app(Pipeline::class)
 ->send($content)
 ->through($pipes)
 ->via('customMethodName') // <---- 就是这个 :)
 ->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]);
    });
ログイン後にコピー
最後の言葉

この種の問題に対処する方法はたくさんあることを覚えておいてください。どのように選択するかはあなた次第です。ただし、必要なときにすでに組み込まれている知識ベースにこの新しい武器に関する知識があることをうれしく思います。

この例で「Laravel パイプライン」をより深く理解し、その使用方法を知ることができれば幸いです。

仕組みについて詳しく知りたい場合は、laravel API ドキュメントをチェックすることもできます。

関連する推奨事項:

Laravel Docker を自分で構築する 開発環境メソッド

以上がLaravelパイプライン(コード)の詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート