Laravel5.1框架注冊中間件的三種場景詳解
本文實例講述了Laravel5.1框架注冊中間件的三種場景。分享給大家供大家參考,具體如下:
在Laravel中注冊中間件主要有三種場景,一種給控制器中的方法進行注冊,一種是給整個控制器進行注冊,最后一種是給全局注冊中間件。
- 1、在控制器中的方法中注冊中間件
這種需求是最為常見,這個例子是給IndexController中的index方法添加中間件。
Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);
- 2、在整個控制器中注冊中間件
這種需求有的時候也會出現(xiàn),如果給整個控制器中注冊中間件,那么這個控制器中的所有方法都注冊了該中間件。跟我一起來找到答案!
控制器基類(Controller.php)
首先來看一下控制器基類,可以看到Controller類繼承了BaseController類,而BaseController的路徑是Illuminate\Routing\Controller,然后我們來看看Laravel的源碼。
<?php namespace App\Http\Controllers; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Routing\Controller as BaseController; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; abstract class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; }
BaseController類
從源碼中我們可以看到有一個屬性為middleware,這個middleware屬性就是我們要找的,所以只要在需要注冊的控制器下使用這個屬性即可完成注冊。
protected $middleware = [];
<?php namespace Illuminate\Routing; use BadMethodCallException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; abstract class Controller { /** * The middleware registered on the controller. * * @var array */ protected $middleware = []; /** * Register middleware on the controller. * * @param array|string|\Closure $middleware * @param array $options * @return \Illuminate\Routing\ControllerMiddlewareOptions */ public function middleware($middleware, array $options = []) { foreach ((array) $middleware as $m) { $this->middleware[] = [ 'middleware' => $m, 'options' => &$options, ]; } return new ControllerMiddlewareOptions($options); } /** * Get the middleware assigned to the controller. * * @return array */ public function getMiddleware() { return $this->middleware; } /** * Execute an action on the controller. * * @param string $method * @param array $parameters * @return \Symfony\Component\HttpFoundation\Response */ public function callAction($method, $parameters) { return call_user_func_array([$this, $method], $parameters); } /** * Handle calls to missing methods on the controller. * * @param array $parameters * @return mixed * * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public function missingMethod($parameters = []) { throw new NotFoundHttpException('Controller method not found.'); } /** * Handle calls to missing methods on the controller. * * @param string $method * @param array $parameters * @return mixed * * @throws \BadMethodCallException */ public function __call($method, $parameters) { throw new BadMethodCallException("Method [{$method}] does not exist."); }
給整個控制器注冊中間件
我們選用系統(tǒng)的Authenticate中間件來舉例,這個中間件是用于檢測用戶是否登錄。
注意:中間件的名稱為鍵,值可以是一個空數(shù)組
protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];
- 3、全局注冊中間件
打開app/Http/Kernel.php,這是一個內(nèi)核文件,可以看到一個屬性$middleware,我們只需要將我們自定義的中間件的路徑添加到這個$middleware 這個屬性中即可。
此外還有一個$routeMiddleware屬性,使用這個屬性可以根據(jù)路由來注冊中間件。
我們的路由有:goods/info,goods/detail兩個路由器
我們可以將$routeMiddleware屬性添加一行
'goods.*' => \App\Http\Middleware\GoodsMiddleware::class,
<?php namespace App\Http; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ]; /** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, ]; }
更多關(guān)于Laravel相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優(yōu)秀開發(fā)框架總結(jié)》、《php面向?qū)ο蟪绦蛟O(shè)計入門教程》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家基于Laravel框架的PHP程序設(shè)計有所幫助。
相關(guān)文章
Laravel5.1 框架模型工廠ModelFactory用法實例分析
這篇文章主要介紹了Laravel5.1 框架模型工廠ModelFactory用法,結(jié)合實例形式分析了laravel5.1框架模型工廠ModelFactory基本功能、定義與使用方法,需要的朋友可以參考下2020-01-01Laravel 解決composer相關(guān)操作提示php相關(guān)異常的問題
今天小編就為大家分享一篇Laravel 解決composer相關(guān)操作提示php相關(guān)異常的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10PHP遞歸獲取目錄內(nèi)所有文件的實現(xiàn)方法
下面小編就為大家?guī)硪黄狿HP遞歸獲取目錄內(nèi)所有文件的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-11-11php??intval函數(shù)的用法示例小結(jié)
這篇文章主要介紹了php??intval函數(shù)的用法,intval()函數(shù)用于將字符串轉(zhuǎn)換為整數(shù),可以指定進制數(shù),并可以處理前導(dǎo)零和非數(shù)字字符,本文通過示例給大家介紹的非常詳細,需要的朋友可以參考下2023-10-10PHP curl實現(xiàn)抓取302跳轉(zhuǎn)后頁面的示例
這篇文章主要介紹了PHP curl實現(xiàn)抓取302跳轉(zhuǎn)后頁面的示例,主要是對CURLOPT_CUSTOMREQUEST參數(shù)的運用,需要的朋友可以參考下2014-07-07PHP基于GD庫的縮略圖生成代碼(支持jpg,gif,png格式)
你可能會遇到這樣的問題,在用戶上傳了一張圖片后,得到這張圖片的縮略圖,PHP可以使用GD庫生成縮略圖,那么我們來探討下,如何才能生成高質(zhì)量的縮略圖呢?2014-06-06