当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel5.1框架注册中间件的三种场景详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-03 16:20:21 浏览: 评论:0 

本文实例讲述了Laravel5.1框架注册中间件的三种场景,分享给大家供大家参考,具体如下:

在Laravel中注册中间件主要有三种场景,一种给控制器中的方法进行注册,一种是给整个控制器进行注册,最后一种是给全局注册中间件。

1、在控制器中的方法中注册中间件

这种需求是最为常见,这个例子是给IndexController中的index方法添加中间件。

Route::get('/', ['middleware'=>['App\Http\Middleware\EmailMiddleware'],'uses'=>'IndexController@index']);

2、在整个控制器中注册中间件

这种需求有的时候也会出现,如果给整个控制器中注册中间件,那么这个控制器中的所有方法都注册了该中间件。跟我一起来找到答案!

控制器基类(Controller.php)

首先来看一下控制器基类,可以看到Controller类继承了BaseController类,而BaseController的路径是Illuminate\Routing\Controller,然后我们来看看Laravel的源码。

  1. <?php 
  2. namespace App\Http\Controllers; 
  3. use Illuminate\Foundation\Bus\DispatchesJobs; 
  4. use Illuminate\Routing\Controller as BaseController; 
  5. use Illuminate\Foundation\Validation\ValidatesRequests; 
  6. use Illuminate\Foundation\Auth\Access\AuthorizesRequests; 
  7. abstract class Controller extends BaseController 
  8. { 
  9.   use AuthorizesRequests, DispatchesJobs, ValidatesRequests; 
  10. } 

BaseController类

从源码中我们可以看到有一个属性为middleware,这个middleware属性就是我们要找的,所以只要在需要注册的控制器下使用这个属性即可完成注册。

protected $middleware = [];

  1. <?php 
  2. namespace Illuminate\Routing; 
  3. use BadMethodCallException; 
  4. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 
  5. abstract class Controller 
  6. { 
  7.   /** 
  8.    * The middleware registered on the controller. 
  9.    * 
  10.    * @var array 
  11.    */ 
  12.   protected $middleware = []; 
  13.   /** 
  14.    * Register middleware on the controller. 
  15.    * 
  16.    * @param array|string|\Closure $middleware 
  17.    * @param array  $options 
  18.    * @return \Illuminate\Routing\ControllerMiddlewareOptions 
  19.    */ 
  20.   public function middleware($middleware, array $options = []) 
  21.   { 
  22.     foreach ((array) $middleware as $m) { 
  23.       $this->middleware[] = [ 
  24.         'middleware' => $m, 
  25.         'options' => &$options, 
  26.       ]; 
  27.     } 
  28.     return new ControllerMiddlewareOptions($options); 
  29.   } 
  30.   /** 
  31.    * Get the middleware assigned to the controller. 
  32.    * 
  33.    * @return array 
  34.    */ 
  35.   public function getMiddleware() 
  36.   { 
  37.     return $this->middleware; 
  38.   } 
  39.   /** 
  40.    * Execute an action on the controller. 
  41.    * 
  42.    * @param string $method 
  43.    * @param array  $parameters 
  44.    * @return \Symfony\Component\HttpFoundation\Response 
  45.    */ 
  46.   public function callAction($method, $parameters) 
  47.   { 
  48.     return call_user_func_array([$this, $method], $parameters); 
  49.   } 
  50.   /** 
  51.    * Handle calls to missing methods on the controller. 
  52.    * 
  53.    * @param array  $parameters 
  54.    * @return mixed 
  55.    * 
  56.    * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException 
  57.    */ 
  58.   public function missingMethod($parameters = []) 
  59.   { 
  60.     throw new NotFoundHttpException('Controller method not found.'); 
  61.   } 
  62.   /** 
  63.    * Handle calls to missing methods on the controller. 
  64.    * 
  65.    * @param string $method 
  66.    * @param array  $parameters 
  67.    * @return mixed 
  68.    * 
  69.    * @throws \BadMethodCallException 
  70.    */ 
  71.   public function __call($method, $parameters) 
  72.   { 
  73.     throw new BadMethodCallException("Method [{$method}] does not exist."); 
  74.   } 

给整个控制器注册中间件

我们选用系统的Authenticate中间件来举例,这个中间件是用于检测用户是否登录。

注意:中间件的名称为键,值可以是一个空数组

protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];

3、全局注册中间件

打开app/Http/Kernel.php,这是一个内核文件,可以看到一个属性$middleware,我们只需要将我们自定义的中间件的路径添加到这个$middleware 这个属性中即可。

此外还有一个$routeMiddleware属性,使用这个属性可以根据路由来注册中间件。

我们的路由有:goods/info,goods/detail两个路由器

我们可以将$routeMiddleware属性添加一行

'goods.*' => \App\Http\Middleware\GoodsMiddleware::class,

  1. <?php 
  2. namespace App\Http; 
  3. use Illuminate\Foundation\Http\Kernel as HttpKernel; 
  4. class Kernel extends HttpKernel 
  5. { 
  6.   /** 
  7.    * The application's global HTTP middleware stack. 
  8.    * 
  9.    * @var array 
  10.    */ 
  11.   protected $middleware = [ 
  12.     \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, 
  13.     \App\Http\Middleware\EncryptCookies::class, 
  14.     \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 
  15.     \Illuminate\Session\Middleware\StartSession::class, 
  16.     \Illuminate\View\Middleware\ShareErrorsFromSession::class, 
  17.     \App\Http\Middleware\VerifyCsrfToken::class, 
  18.   ]; 
  19.   /** 
  20.    * The application's route middleware. 
  21.    * 
  22.    * @var array 
  23.    */ 
  24.   protected $routeMiddleware = [ 
  25.     'auth' => \App\Http\Middleware\Authenticate::class, 
  26.     'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
  27.     'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
  28.   ]; 
  29. }

Tags: Laravel5 1注册中间件

分享到: