成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Laravel Pipeline解讀

Neilyo / 1958人閱讀

摘要:大家好,今天給大家介紹下框架的。它是一個(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è)簡化版本:
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)用。

簡單使用示例
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)的添加功能,而不對其它層次產(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/29913.html

相關(guān)文章

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

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

    enda 評論0 收藏0
  • Laravel核心解讀--控制器

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

    fxp 評論0 收藏0
  • Laravel核心解讀 -- Response

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

    TigerChain 評論0 收藏0
  • Laravel 5.5 升級到 5.5.42 后遇到的 Cookie 序列化問題

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

    jollywing 評論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 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<