成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel Pipeline解讀

Neilyo / 1915人閱讀

摘要:大家好,今天給大家介紹下框架的。它是一個(gè)非常好用的組件,能夠使代碼的結(jié)構(gòu)非常清晰。的中間件機(jī)制便是基于它來實(shí)現(xiàn)的。通過,生成一個(gè)接受一個(gè)參數(shù)的匿名函數(shù),然后執(zhí)行調(diào)用。不合法可以執(zhí)行初始化狀態(tài)的操作可以執(zhí)行保存狀態(tài)信息的操作執(zhí)行其它邏輯

大家好,今天給大家介紹下Laravel框架的Pipeline。
它是一個(gè)非常好用的組件,能夠使代碼的結(jié)構(gòu)非常清晰。 Laravel的中間件機(jī)制便是基于它來實(shí)現(xiàn)的。

通過Pipeline,可以輕松實(shí)現(xiàn)APO編程。

官方GIT地址

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

下面的代碼是我實(shí)現(xiàn)的一個(gè)簡(jiǎn)化版本:
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,生成一個(gè)接受一個(gè)參數(shù)的匿名函數(shù),然后執(zhí)行調(diào)用。

簡(jiǎn)單使用示例
class ALogic
{
    public static function handle($data, Clourse $next)
    {
        print "開始 A 邏輯";
        $ret = $next($data);
        print "結(jié)束 A 邏輯";
        return $ret;
    }
}

class BLogic
{
    public static function handle($data, Clourse $next)
    {
        print "開始 B 邏輯";
        $ret = $next($data);
        print "結(jié)束 B 邏輯";
        return $ret;
    }
}

class CLogic
{
    public static function handle($data, Clourse $next)
    {
        print "開始 C 邏輯";
        $ret = $next($data);
        print "結(jié)束 C 邏輯";
        return $ret;
    }
}
$pipes = [
    ALogic::class,
    BLogic::class,
    CLogic::class
];

$data = "any things";
(new Pipeline())->send($data)->through($pipes)->then(function($data){ print $data;});
運(yùn)行結(jié)果:
"開始 A 邏輯"
"開始 B 邏輯"
"開始 C 邏輯"
"any things"
"結(jié)束 C 邏輯"
"結(jié)束 B 邏輯"
"結(jié)束 A 邏輯"
AOP示例

AOP 的優(yōu)點(diǎn)就在于動(dòng)態(tài)的添加功能,而不對(duì)其它層次產(chǎn)生影響,可以非常方便的添加或者刪除功能。

class IpCheck
{
    public static function handle($data, Clourse $next)
    {
        if ("IP invalid") { // IP 不合法
            throw Exception("ip invalid");
        }
        return $next($data);
    }
}

class StatusManage
{
    public static function handle($data, Clourse $next)
    {
        // exec 可以執(zhí)行初始化狀態(tài)的操作
        $ret = $next($data)
        // exec 可以執(zhí)行保存狀態(tài)信息的操作
        return $ret;
    }
}

$pipes = [
    IpCheck::class,
    StatusManage::class,
];

(new Pipeline())->send($data)->through($pipes)->then(function($data){ "執(zhí)行其它邏輯";});

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29913.html

相關(guān)文章

  • Laravel核心解讀--中間件(Middleware)

    摘要:解析出后將進(jìn)入應(yīng)用的請(qǐng)求對(duì)象傳遞給的方法,在方法負(fù)責(zé)處理流入應(yīng)用的請(qǐng)求對(duì)象并返回響應(yīng)對(duì)象。攜帶了本次迭代的值。通過這種方式讓請(qǐng)求對(duì)象依次流過了要通過的中間件,達(dá)到目的地的方法。 中間件(Middleware)在Laravel中起著過濾進(jìn)入應(yīng)用的HTTP請(qǐng)求對(duì)象(Request)和完善離開應(yīng)用的HTTP響應(yīng)對(duì)象(Reponse)的作用, 而且可以通過應(yīng)用多個(gè)中間件來層層過濾請(qǐng)求、逐步完善...

    enda 評(píng)論0 收藏0
  • Laravel核心解讀--控制器

    摘要:下面是剛才說的這些步驟對(duì)應(yīng)的核心代碼收集路由和控制器里應(yīng)用的中間件我們?cè)谇懊娴奈恼吕镆呀?jīng)詳細(xì)的解釋過中間件和路由的原理了,接下來就看看當(dāng)請(qǐng)求最終找到了路由對(duì)應(yīng)的控制器方法后是如何為控制器方法注入正確的參數(shù)并調(diào)用控制器方法的。 控制器 控制器能夠?qū)⑾嚓P(guān)的請(qǐng)求處理邏輯組成一個(gè)單獨(dú)的類, 通過前面的路由和中間件兩個(gè)章節(jié)我們多次強(qiáng)調(diào)Laravel應(yīng)用的請(qǐng)求在進(jìn)入應(yīng)用后首現(xiàn)會(huì)通過Http Ker...

    fxp 評(píng)論0 收藏0
  • Laravel核心解讀 -- Response

    摘要:設(shè)置生成對(duì)象后就要執(zhí)行對(duì)象的方法了,該方法定義在類中,其主要目的是對(duì)進(jìn)行微調(diào)使其能夠遵從協(xié)議。最后會(huì)把完整的響應(yīng)發(fā)送給客戶端。本文已經(jīng)收錄在系列文章源碼學(xué)習(xí)里,歡迎訪問閱讀。 Response 前面兩節(jié)我們分別講了Laravel的控制器和Request對(duì)象,在講Request對(duì)象的那一節(jié)我們看了Request對(duì)象是如何被創(chuàng)建出來的以及它支持的方法都定義在哪里,講控制器時(shí)我們?cè)敿?xì)地描述了...

    TigerChain 評(píng)論0 收藏0
  • Laravel 5.5 升級(jí)到 5.5.42 后遇到的 Cookie 序列化問題

    摘要:查閱官方文檔后得知,新版為了防止對(duì)象的序列化反序列化漏洞被利用,不再對(duì)值進(jìn)行自動(dòng)的序列化和反序列化處理。舉個(gè)栗子更新到后,因?yàn)椴辉僮詣?dòng)對(duì)值進(jìn)行序列化處理,而只能加密字符串?dāng)?shù)據(jù),這個(gè)時(shí)候程序就會(huì)拋出錯(cuò)誤。 最近手殘升級(jí)了項(xiàng)目里 Laravel 的小版本號(hào)(v5.5.39 => v5.5.45),這不升級(jí)則已,一升級(jí)就出了問題! Sentry 平臺(tái)上提示錯(cuò)誤:openssl_encrypt...

    jollywing 評(píng)論0 收藏0
  • laravel使用中遇到的問題

    又有一段時(shí)間沒有學(xué)習(xí)了!迷茫,除了迷茫還是在迷茫!最近,公司接了一個(gè)laravel的項(xiàng)目,可惜沒有phper,于是開始學(xué)習(xí)laravel,現(xiàn)在的情況就是還沒學(xué)會(huì)走路就要開始跑了,所以遇到坑會(huì)摔得很痛! 安裝出現(xiàn)的問題 安裝步驟(5.3.*) composer global require laravel/installer composer create...

    maybe_009 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<