ホームページ > PHPフレームワーク > Laravel > Laravel フレームワークでのパイプライン解析 (コード例)

Laravel フレームワークでのパイプライン解析 (コード例)

不言
リリース: 2019-01-08 11:28:37
転載
3364 人が閲覧しました

この記事の内容はLaravelフレームワークにおけるPipelineの解析(コード例)です。お困りの方は参考にしていただければ幸いです。

皆さんこんにちは。今日はLaravelフレームワークのパイプラインを紹介します。

これは、コードの構造を非常に明確にすることができる、非常に使いやすいコンポーネントです。 Laravelのミドルウェア機構はそれをベースに実装されています。

パイプラインを使用すると、APO プログラミングを簡単に実装できます。

公式 GIT アドレス

https://github.com/illuminate...

次のコードは、私の実装の簡略化されたバージョンです:

class Pipeline
{

    /**
     * The method to call on each pipe
     * @var string
     */
    protected $method = 'handle';

    /**
     * The object being passed throw the pipeline
     * @var mixed
     */
    protected $passable;

    /**
     * The array of class pipes
     * @var array
     */
    protected $pipes = [];

    /**
     * Set the object being sent through the pipeline
     *
     * @param $passable
     * @return $this
     */
    public function send($passable)
    {
        $this->passable = $passable;
        return $this;
    }

    /**
     * Set the method to call on the pipes
     * @param array $pipes
     * @return $this
     */
    public function through($pipes)
    {
        $this->pipes = $pipes;
        return $this;
    }

    /**
     * @param \Closure $destination
     * @return mixed
     */
    public function then(\Closure $destination)
    {
        $pipeline = array_reduce(array_reverse($this->pipes), $this->getSlice(), $destination);
        return $pipeline($this->passable);
    }


    /**
     * Get a Closure that represents a slice of the application onion
     * @return \Closure
     */
    protected function getSlice()
    {
        return function($stack, $pipe){
            return function ($request) use ($stack, $pipe) {
                return $pipe::{$this->method}($request, $stack);
            };
        };
    }

}
ログイン後にコピー

このタイプの主なロジックは then メソッドと getSlice メソッドにあります。 array_reduce を使用して、1 つのパラメーターを受け入れる匿名関数を生成し、呼び出しを実行します。

簡単な使用例

class ALogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 A 逻辑";
        $ret = $next($data);
        print "结束 A 逻辑";
        return $ret;
    }
}

class BLogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 B 逻辑";
        $ret = $next($data);
        print "结束 B 逻辑";
        return $ret;
    }
}

class CLogic
{
    public static function handle($data, \Clourse $next)
    {
        print "开始 C 逻辑";
        $ret = $next($data);
        print "结束 C 逻辑";
        return $ret;
    }
}
ログイン後にコピー
$pipes = [
    ALogic::class,
    BLogic::class,
    CLogic::class
];

$data = "any things";
(new Pipeline())->send($data)->through($pipes)->then(function($data){ print $data;});
ログイン後にコピー
実行結果:
"开始 A 逻辑"
"开始 B 逻辑"
"开始 C 逻辑"
"any things"
"结束 C 逻辑"
"结束 B 逻辑"
"结束 A 逻辑"
ログイン後にコピー

AOP の例

AOP の利点は、他のレイヤーに影響を与えることなく関数を動的に追加できることです。 , 機能の追加や削除がとても便利です。

rreeee

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

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