上一部分講述了laravel路由的基本用法谒拴,現(xiàn)在我們要了解更多路由上的內(nèi)容尝江。
中間件#
在官方文檔上,這一部分是在路由的后面英上,但我想把它挪到前面來炭序,這樣更為合理。
這是什么呢苍日?
我們知道惭聂,路由是一個過程,分析來自客戶端的請求按照路由規(guī)則分發(fā)至相應(yīng)的處理邏輯相恃。但有種情況辜纲,打個比方:后臺。后臺不是所有人都能訪問的拦耐,我們在正式的處理邏輯前耕腾,需要做一個驗證,比如驗證是否具有權(quán)限或者請求的數(shù)據(jù)是否合法杀糯。
這時候扫俺,路由過程的一部分——中間件就上場了。
上述內(nèi)容來自中文版的laravel5文檔固翰,里面很好的說明了中間件的作用狼纬。在laravel5以前的版本,只有過濾器(路由篩選器)骂际,目的和現(xiàn)在的中間件一樣都是在請求到處理邏輯之間的一個中間過程疗琉,一般用作前置和后置的判斷、驗證。通過中間件我們可以在控制器里專注其本身的邏輯,就好比一個后臺的控制器缔俄,我只需要專注于顯示用戶列表或者文章列表仆抵、去處理添加的文章等等椒涯,而不需要關(guān)注訪問者是否是合法的后臺管理員屡萤,驗證權(quán)限的工作漫仆,應(yīng)該交由中間件夕玩。通過中間件驗證就會正常處理种吸,不通過就會被重定向或者其他操作弃衍。
Laravel默認(rèn)已經(jīng)內(nèi)置了許多中間件,且默認(rèn)開啟坚俗【刀ⅲ可以通過編輯app/Http/Kernel.php來決定是否啟用這些中間件。自己開發(fā)的中間件也是在這里進(jìn)行注冊的哦猖败。
我們在app/Http/Kernel.php文件中的$routeMiddleware數(shù)組注冊了一個獨(dú)立中間件速缆,這一中間件可被單獨(dú)用綁定在一個路由和路由組上。在路由定義的時候可以像這樣:
當(dāng)我們訪問http://yourdomain/admin/profile的時候恩闻,首先會經(jīng)過全局中間件艺糜,然后就是我們在app/Http/Kernel.php的$routeMiddleware數(shù)組中定義的名稱為auth的中間件。
說了這么多關(guān)于如何定義幢尚,那么中間件類里面應(yīng)該是什么樣的呢破停?看過文檔的應(yīng)該知道是這樣的(下面的代碼和文檔里的有些區(qū)別哦):
上面這段代碼是已經(jīng)寫好了的中間件,handle方法里面的內(nèi)容就是中間件實(shí)際的代碼尉剩。
如果在中間件中真慢,通過了你的驗證、或者前置的操作邏輯理茎,記得通過代碼return $next($request)(上述例子中28行)將請求導(dǎo)向下一個中間件黑界,如果后面沒有中間件,就會到的處理邏輯(比如控制器等)皂林。
上述中間件是一個前置操作的中間件朗鸠,什么意思呢?就是在作用在實(shí)際處理邏輯前的中間件式撼,就是一個前置中間件童社。相反求厕,當(dāng)一個實(shí)際處理邏輯運(yùn)行完以后通過的中間件著隆,就是一個后置中間件。
后置中間件結(jié)構(gòu)如下:
我們看得出呀癣,區(qū)別在于多了個$response = $next($request)美浦,返回值也變了。很好理解项栏,$next($request)返回的值是整個請求經(jīng)過無數(shù)具體處理邏輯后產(chǎn)生的最終響應(yīng)浦辨,這個響應(yīng)一般是一堆html代碼(渲染后的視圖),也可能是一個json等等沼沈。我們可以在中間件里面對這個響應(yīng)做最后加工處理流酬,最后返回處理完的結(jié)果币厕。
路由組群#
這一塊官方文檔有著十分詳盡的描述,但是似乎不太容易理解芽腾。先說說適用場景旦装。
同時,利用路由組摊滔,定義子域名變得十分容易:
子域名也可以擁有通配符阴绢,以此實(shí)現(xiàn)更為靈活的結(jié)構(gòu)。比如我希望我的網(wǎng)站每一個用戶都擁有自己的二級域名艰躺,類似于這樣:userA.yourdomain.com呻袭,userB.yourdomain.com。這時候可以這樣寫:
可以通過參數(shù)獲取域名上的通配符匹配的值腺兴。
除這些以外左电,路由組帶來的便利相當(dāng)豐富,在這里基本把路由組存在的意義說完了含长,其他關(guān)于路由組的可以移步至官方文檔了解券腔。