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


Posted in PHP onJuly 09, 2019

本文实例讲述了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的源码。

<?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.");
  }

给整个控制器注册中间件

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

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

protected $middleware = ['\App\Http\Middleware\Authenticate'=>[]];
  • 3、全局注册中间件

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

此外还有一个$routeMiddleware属性,使用这个属性可以根据路由来注册中间件。
我们的路由有:goods/infogoods/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,
  ];
}

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

PHP 相关文章推荐
如何批量替换相对地址为绝对地址(利用bat批处理实现)
May 27 PHP
Yii框架获取当前controlle和action对应id的方法
Dec 03 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
php判断数组中是否存在指定键(key)的方法
Mar 17 PHP
使用PHP生成二维码的方法汇总
Jul 22 PHP
分享php多功能图片处理类
May 15 PHP
使用XHProf查找PHP性能瓶颈的实例
Dec 13 PHP
PHP的mysqli_set_charset()函数讲解
Jan 23 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
PHP实现创建一个RPC服务操作示例
Feb 23 PHP
一文看懂PHP进程管理器php-fpm
Jun 01 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
Sep 17 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 #PHP
PHP 7.4中使用预加载的方法详解
Jul 08 #PHP
php apache开启跨域模式过程详解
Jul 08 #PHP
php如何把表单内容提交到数据库
Jul 08 #PHP
php利用array_search与array_column实现二维数组查找
Jul 08 #PHP
php实现获取近几日、月时间示例
Jul 06 #PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 #PHP
You might like
PHP 数据库树的遍历方法
2009/02/06 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
2016/02/26 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
PHP实现数组和对象的相互转换操作示例
2019/03/20 PHP
编写Js代码要注意的几条规则
2010/09/10 Javascript
jQuery 中使用JSON的实现代码
2011/12/01 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
js修改table中Td的值(定义td的双击事件)
2013/01/10 Javascript
javascript获取隐藏dom的宽高 具体实现
2013/07/14 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
python获取糗百图片代码实例
2013/12/18 Python
tornado捕获和处理404错误的方法
2014/02/26 Python
Python 遍历列表里面序号和值的方法(三种)
2017/02/17 Python
Sublime开发python程序的示例代码
2018/01/24 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
python打开文件的方式有哪些
2020/06/29 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
凯特方迪化妆品官网:Kat Von D Beauty
2016/11/15 全球购物
世界顶级户外运动品牌折扣网站:LeftLane Sports
2019/06/12 全球购物
用C#语言写出在本地创建一个UDP接收端口的具体过程
2016/02/22 面试题
药品营销策划方案
2014/06/15 职场文书
名人演讲稿范文
2014/09/16 职场文书
投标承诺函范文
2015/01/21 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript