本文實例講述了Laravel5.1框架注冊中間件的三種場景。分享給大家供大家參考,具體如下:
在Laravel中注冊中間件主要有三種場景,一種給控制器中的方法進行注冊,一種是給整個控制器進行注冊,最后一種是給全局注冊中間件。
這種需求是最為常見,這個例子是給IndexController中的index方法添加中間件。
Route::get('/', ['middleware'=>['App/Http/Middleware/EmailMiddleware'],'uses'=>'IndexController@index']);
這種需求有的時候也會出現,如果給整個控制器中注冊中間件,那么這個控制器中的所有方法都注冊了該中間件。跟我一起來找到答案!
控制器基類(Controller.php)
首先來看一下控制器基類,可以看到Controller類繼承了BaseController類,而BaseController的路徑是Illuminate/Routing/Controller,然后我們來看看Laravel的源碼。
<?phpnamespace 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 = [];
<?phpnamespace 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."); }
給整個控制器注冊中間件
我們選用系統的Authenticate中間件來舉例,這個中間件是用于檢測用戶是否登錄。
注意:中間件的名稱為鍵,值可以是一個空數組
protected $middleware = ['/App/Http/Middleware/Authenticate'=>[]];
打開app/Http/Kernel.php,這是一個內核文件,可以看到一個屬性$middleware,我們只需要將我們自定義的中間件的路徑添加到這個$middleware 這個屬性中即可。
此外還有一個$routeMiddleware屬性,使用這個屬性可以根據路由來注冊中間件。
我們的路由有:goods/info,goods/detail兩個路由器
我們可以將$routeMiddleware屬性添加一行
'goods.*' => /App/Http/Middleware/GoodsMiddleware::class,
<?phpnamespace 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, ];}
希望本文所述對大家基于Laravel框架的PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選