真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

php模式之裝飾者模式學(xué)習(xí)

name = $name;
     echo '我叫'.$name.'我準(zhǔn)備出門了
';    }       public function display()    {         echo '我出門了
';    }  }  /**  *裝飾器1,和被裝飾者一樣都是屬于Decorate接口的實(shí)現(xiàn)  **/     class Wash implements Decorate  {       private $compact;          public function __construct(Decorate $compact)    {      $this->compact = $compact;            }       public function display()    {      echo '我是一個裝飾器1,出門之前先換件衣服
';      $this->compact->display();    }     } /** *裝飾器2 **/  class Dress implements Decorate  {       private $compact;          public function __construct(Decorate $compact)    {      $this->compact = $compact;            }       public function display()    {         echo '我是一個裝飾器2,換衣服之前,先洗把臉
';      $this->compact->display();                  }     }        /**  *裝飾器3  **/     class Close implements Decorate  {       private $compact;          public function __construct(Decorate $compact)    {      $this->compact = $compact;            }       public function display()    {              $this->compact->display();      echo '我是裝飾器3,把門鎖了
';    }  }        $person = new Person('韓梅梅');  //開始裝飾   $dress = new Dress($person);      $wash = new Wash($dress);      $close = new Close($wash);      $close->display();

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都做網(wǎng)站、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、輝南ssl等。為上千企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的輝南網(wǎng)站制作公司

laravel中裝飾器模式實(shí)現(xiàn)----中間件(middleware)

laravel中的實(shí)現(xiàn)方式可能與上面講的不一樣,但是其軟件設(shè)計模式是相通的,通過對請求不斷的裝飾,

只是它裝飾采用的是閉包傳入的方式。

核心源碼解析

/**
 * Send the given request through the middleware / router.
 *
 * @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))
              //發(fā)送請求到管道中
                ->send($request)
                //thtough()方法可以理解成在收集該請求過程中
                //的中間鍵數(shù)組包括基礎(chǔ)服務(wù)的和用戶自定義的
                ->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)
                ->then($this->dispatchToRouter());
}

 核心方法是在then() 我們接著來看then()里面的實(shí)現(xiàn)

/**
 * Run the pipeline with a final destination callback.
 *
 * @param  \Closure  $destination
 * @return mixed
 */
public function then(Closure $destination)
{
    $pipeline = array_reduce(
        array_reverse($this->pipes), $this->carry(), $this->prepareDestination($destination) 
   //這里$this->pipes即為要通過的中間件數(shù)組,$this->carray()是一個閉包處理函數(shù)。它會
   //執(zhí)行當(dāng)前上一次傳入的閉包,同時可以決定在執(zhí)行前或執(zhí)行后,插入邏輯(即中間件)。
   //$this->prepareDestination($destination)也是一個閉包,可以理解成沒用中間件的情況
    //請求過程中會執(zhí)行的
    );

    return $pipeline($this->passable);
}

這里的難點(diǎn)和巧妙在于mixed array_reduce( array $array , callable $callback   [, mixed $initial = NULL  ] );

官方的說法是--array_reduce — 用回調(diào)函數(shù)迭代地將數(shù)組簡化為單一的值。通俗一點(diǎn)講就是以$callback遍歷處理$array,每次傳入的是上一次回調(diào)處理的函數(shù)和當(dāng)前數(shù)組元素(是不是有點(diǎn)像裝飾者,一層一層裝飾);由于篇幅有限,具體使用和理解請參考手冊。

這里比較難理解的是在傳入?yún)?shù)上,laravel框架中傳入的第一個參數(shù)---中間件對象數(shù)組 。它會使用上一次處理的結(jié)果(閉包對象$next),在根據(jù)自己的handle方法,該方法接受一個參數(shù)--$next,這樣就可以在$next()方法之前,或之后添加邏輯了。

指的一提的是,最后返回的還是一個閉包對象,所以在最后執(zhí)行了一次,相當(dāng)于啟動,內(nèi)部就會依次聯(lián)動。

單是文字確實(shí)難以理解,后續(xù)有時間會把代碼補(bǔ)上。

由于作者水平有限,如有錯誤還望海涵。


分享標(biāo)題:php模式之裝飾者模式學(xué)習(xí)
網(wǎng)址分享:http://weahome.cn/article/ihgpdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部