laravel - 5.3中間件執行流程重大改變!
伊谢尔伦
伊谢尔伦 2017-05-16 16:49:21
0
2
803

國內沒人用最新版本,沒發現這個邏輯變化?都不在建構函式裡判斷使用者登入的(沒發現的你悲劇了)?
幫我看下這個正式回覆:https://github.com/laravel/fr...
**我英文不好!解釋下! laravel5.3很重要的改進
為什麼要這麼做?
我該怎麼寫新的邏輯? **
我需要這樣改進的理由,我要怎麼解決我的邏輯!

疑問這樣做就是廢了__construct
那麼中間件的except應該加到中間件作為一個屬性比較合理!
protected $except =['login','register','oauth_callback'];
糾結:加了這個覺得不合理(多個群組呼叫這個的話就不合理了),不加這個吧為了一個登陸寫__construct又覺得不好!

目前答案:1樓的其實也可以,不過這個優雅多了
callAction說明:https://laravel.com/api/maste...



##laravel 5.3,反正是最新的,每次都update!
現在有這3個,中間件,控制器,建構子
有2個函數必須在建構函式裡實例化。而且必須登入狀態下,不登入不准實例化。 建構子:

##中介軟體:

##方法:

#輸出:


#路由裡


### ###自訂中間件###

##按laravel的邏輯輸出:
2建構子
1中間件
3這是推廣

但是這樣的話構造函數裡沒登入就實例化了,而且不管中間件放在哪,都是先運行建構子再運行中間件的,
我要的結果是:
1中間件,判斷登錄,沒登陸就跳到
2建構函數,登入後實例化
3這是推廣,執行推廣!
怎麼修改邏輯,我要登入後才呼叫公用方法,沒登入的跳轉登入(排除註冊和登入)!

大概的問題就是laravel必須先運行構函數,然後才可以呼叫中間件,
那我應該怎麼個邏輯才可以實現我的要求的!

$this->wx_api();
$this->agent();

這2個公用的,一般都寫到__construct裡的吧!

我還是納悶,照常理,路由器裡定義了,判斷類別裡有這個方法,然後這時候呼叫中間件,然後執行建構函數,然後是方法!怎麼會這種流程呢!


粗暴方法問題,看下面的(不能在構造函數裡跳轉,寫echo和exit在laravel你會覺得超級難看,反正我受不了,上面的演示純粹為了看!)

http://laravelacademy.org/pos...
仔細的想了一下,發現這個完美的破壞了面向對象的職責分離的要求,並成功的提高了耦合度
因為這句話,我才想使用中間件! (到底哪個好,我是新手,我都不知道怎麼說!)


laravel 5.3是建構Middleware -> 建構Controller ->執行中間件handle -> 執行Controller中間件 -> Controller的方法,所以中間件是在建構子後執行的

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回覆(2)
迷茫

國內我在用最新版5.3

5.3的確改變了中介軟體的實作邏輯

路由匹配 - 读取路由中间件 - 实例化Controller - 读取Controller中间键 - 执行中间件 - 执行action

個人不鼓勵在Controller的建構子中初始化方法,除了使用中間件呼叫之外,不要做任何邏輯判斷的事情。

重写 CallAction 在 CallAction中逻辑判断

因為任何一個路由的匹配都會使用CallAction調取Controller裡面的方法

在5.3以下 版本中,會優先執行中間件,然後初始化Controller,這是和5.3最大的差異。

淡淡烟草味

建構函式本來就是應該先執行的,好像沒什麼不對。 。 。

我翻了下laravel5.3的文檔,現在中間件都是在構造後執行,要么你換成其他低版本,要么不用中間件,或者把你原來構造函數要調用的方法都寫在中間件裡。

舉個栗子:(注意:此特性需要laravel版本5.3.4以上)

public function __construct() {

    $this->middleware(function ($request, $next) {
        $this->wx_api();
        return $next($request);
    });
}

public function wx_api () {
    
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板