中间件是什么?
每个中间件是一个定义了handle方法的类或是一个匿名函数,一般所有中间件放在同一个文件夹middleware中,方便管理
public function handle($request, Closure $next)
中间件有什么用

一: 路由前中间件(也叫全局中间件)

这些中间件,在根据请求找到匹配的路由之前就开始执行

1.配置

// 在 \App\Http\Kernel::$middleware中定义,是一个数组,如
$middleware = [\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,\App\Http\Middleware\TrimStrings::class,\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,\App\Http\Middleware\TrustProxies::class,
];// 在 \Zhiyi\Plus\Http\Kernel::$middleware的值为
$middleware = [\Zhiyi\Plus\Http\Middleware\CrossDomain::class,\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,\Zhiyi\Plus\Http\Middleware\TrimStrings::class,\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,\Zhiyi\Plus\Http\Middleware\TrustProxies::class,
];

2.执行顺序

是按上下执行,这里面的中间执行完后,再执行\Illuminate\Foundation\Http\Kernel::dispatchToRouter()

框架内置的中间件放在Illuminate\Foundation\Http\Middleware下面,一共有6个

二: 路由中间件

这些中间件是在路由匹配之后,与当前匹配路由及控制器有关

1: 在控制器中定义

在控制器的构造函数中定义

public function __construct(){$this->middleWare('auth');$this->middleWare('log',['only'=>['show','detail']]);
}

覆盖getMiddleware()方法

public function getMiddleware(){return ['auth','log',['middleware'=>'hello','options'=>['only'=>['index','show']]]];
}

2: 在路由中定义

在第二个参数中定义middleware

Route::get('/login',['uses'=>'LoginController@index','middleware'=>['abc','def']
])

直接给路由使用middleware()方法

Route::get('/login','')->middleware('中间件1','中间件2');//数组也行

在group中定义

Route::group(['middleware' => ['has-permission:access-dashboard']], function (Router $router) use ($adminRoute) {...
});

为什么全局中间件是一个完整的类名,而路由中间件是键名或群组名
键名或群组名其实是对应一个中间件类,它们的对应关系在Kernel中定义,如

kernel中 $routeMiddleware  对应 router中 middleware属性
kernel中 $middlewareGroups 对应 router中 middlewareGroups属性$routeMiddleware = [别名         => 有handle方法的类名或匿名函数'auth'       => \Illuminate\Auth\Middleware\Authenticate::class,'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,'bindings'   => \Illuminate\Routing\Middleware\SubstituteBindings::class,'can'        => \Illuminate\Auth\Middleware\Authorize::class,'guest'      => \Zhiyi\Plus\Http\Middleware\RedirectIfAuthenticated::class,'throttle'   => \Illuminate\Routing\Middleware\ThrottleRequests::class,'ability'    => \Zhiyi\Plus\Http\Middleware\UserAbility::class,'sensitive'  => \Zhiyi\Plus\Http\Middleware\DisposeSensitive::class,'operation'  => \Zhiyi\Plus\Http\Middleware\SensitiveOperation::class,'wang'       => function(){这是一个闭包}
];$middlewareGroups = ['web' => [\Zhiyi\Plus\Http\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,// \Illuminate\Session\Middleware\AuthenticateSession::class,\Illuminate\View\Middleware\ShareErrorsFromSession::class,\Zhiyi\Plus\Http\Middleware\VerifyCsrfToken::class,\Illuminate\Routing\Middleware\SubstituteBindings::class,'api' //可以是另一组名,这样,如果指定的中间件中web,那么包括上面的和api组中合起来的所有中间件'wang' // 也可以是$routeMiddleware中的一个别名(键名)],'api' => ['throttle:120,1',// :前面是中间件名,:后面是参数'bindings',],'admin' => ['ability:admin: login,你没有权限访问后台。',],
];

路由中间件在进入管道之前,会转为以下一个由完整类名组成的一维数组

Array([0] => Illuminate\Routing\Middleware\ThrottleRequests:120,1[1] => Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse[2] => Illuminate\Session\Middleware\StartSession[3] => Illuminate\View\Middleware\ShareErrorsFromSession[4] => Zhiyi\Plus\Http\Middleware\VerifyCsrfToken[5] => Illuminate\Routing\Middleware\SubstituteBindings
)

中间件的格式

  1. 别名
    $this->middleWare('auth');
  2. 组名

$this->middleWare('api')

  1. 闭包

$this->middleWare(function($request,$next){})

  1. 完整类名 $this->middleWare(IlluminateRoutingMiddlewareThrottleRequests)

三: 使用场景

全局中间件

new Pipeline($this->app))->send($request) ->through($this->middleware) ->then($this->dispatchToRouter())

路由中间件

new Pipeline($this->container))->send($request)->through($middleware)->then(function ($request) use ($route) {                       return $this->prepareResponse($request, $route->run());}
);

由浅入深laravel教程 :中间件相关推荐

  1. 由浅入深laravel教程第1课:搭建homestead开发环境

    本教程有免费配套视频,现在欣赏免费配套视频 laravel官方推荐的Homestead工作环境,安装简单,使用方便,推荐给使用laravel开发项目的程序猿. 本机操作系统:64位Win10 一:前期 ...

  2. Laravel教程 一:安装及环境配置

    Laravel教程 一:安装及环境配置 此文章为原创文章,未经同意,禁止转载. Homestead 最近在SF上面看到越来越多的Laravel相关的问题,而作为一个Laravel的脑残粉,本来打算有机 ...

  3. laravel 控制器 中间件 传递数据_Laravel5 自定义路由中间件的使用步骤,太好用,珍藏了!...

    前言 Laravel5中我们处理request请求,中间会有很多环节.本文所说的中间件,位于路由和控制器之间,起到过滤和筛选请求的作用. 为什么不放到"表单验证"里呢? 因为有些请 ...

  4. php中间件怎么使用,laravel框架中间件简单使用方法示例

    本文实例讲述了laravel框架中间件简单使用方法.分享给大家供大家参考,具体如下: laravel内置了一个中间件来验证用户是否经过认证,如果用户没有经过认证,中间件会将用户重定向到登录页面,否则如 ...

  5. Laravel教程 六:表单 Forms

    Laravel教程 六:表单 Forms 此文章为原创文章,未经同意,禁止转载. Form laravel 5.2 之后请使用 laravelcollective/html 替换 illuminate ...

  6. Laravel教程 四:数据库和Eloquent

    Laravel教程 四:数据库和Eloquent 此文章为原创文章,未经同意,禁止转载. Eloquent Database 上一篇写了一些Laravel Blade的基本用法和给视图传递变量的几种方 ...

  7. 2021年最好的Laravel教程

    2021年最好的Laravel教程 20 Best Laravel Tutorials in 2021 为什么学习Laravel 完善的生态系统 官方提供的软件包(Package) 服务器管理工具和平 ...

  8. php laravel 入门教程,Laravel 5 系列入门教程(一)【最适合中国人的 Laravel 教程】...

    Laravel 5 系列入门教程(一)[最适合中国人的 Laravel 教程] 2015-3-7 / 阅读数:314392 / 分类: Laravel 十分建议学习 5.5,跟 5.0 比变化非常大. ...

  9. laravel教程 第一章安装laravel

    #laravel教程# ##第一章 安装laravel## ###前言 ### 有很多人,都在纠结于自己学什么框架,用什么框架.在这里我想告诉你,框架都是死的,但是人是活的,只要你明白的框架的基本原理 ...

最新文章

  1. stripes framework(框架)入门教程(附案例分析)
  2. 图像梯度增强_使用梯度增强机在R中进行分类
  3. 每日一笑 | 大学教室的真实写照...
  4. CentOs中iptables配置允许mysql远程访问
  5. BZOJ 4819: [Sdoi2017]新生舞会
  6. 数据结构-线性表之单链表
  7. Docker Compose运行MySQL、Redis服务
  8. JavaScript 真正的工作原理,你知道吗?
  9. mybatis入门截图四(订单商品数据模型-懒加载-缓存)
  10. UDK初学教程 01: 基本操作
  11. 真人qq秀代码_波士顿动力Spot买家秀
  12. opendds简单入门(二)
  13. 基于微信小程序毕业论文选题系统(微信小程序毕业设计)
  14. photoshop图片放大不失真
  15. C语言中指数的表现,中证500指数基金C份额汇总比较
  16. SQLite 基本语法(二)
  17. 用html做自我介绍
  18. java 日历工具_Java开发笔记(四十二)日历工具的常见应用
  19. BFGS算法(Broyden-Fletcher-Goldfarb-Shanno算法)
  20. 完整的项目管理流程包括什么?

热门文章

  1. 企鹅帝国的疯狂反扑!
  2. 7.破解的最简单例子
  3. Windows PE变形练手2-开发一套自己的PE嵌入模板
  4. hdu3622 二分+2sat
  5. 【Linux 内核】Linux 内核源码几个重要的入口源文件及函数介绍 ( 系统初始化 | 内存管理 | 虚拟文件系统 | 网络管理 )
  6. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 创建反汇编解析器实例对象 | 设置汇编解析器显示细节 )
  7. 【Android 逆向】IDA 工具使用 ( 交叉引用数量设置 | 调试设置 )
  8. 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )
  9. 【Flutter】打开第三方 Flutter 项目
  10. 【Android 性能优化】应用启动优化 ( 启动白屏问题 | 应用启动时间测量 | 冷启动 | 热启动 | 应用启动时间计算源码分析 )