一.中间件的作用

HTTP 中间件提供了一个便利的机制来过滤进入应用的 HTTP 请求。例如,Laravel 包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就
会允许请求继续往前进入下一步操作。

当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。
Laravel 框架内置了一些中间件,包括维护模式中间件、认证、CSRF 保护中间件等等。所有的中间件都位于app/Http/Middleware 目录。

二.定义中间件

1.命令

  1. php artisan make:middleware OldMiddleware

  

这个命令会在app/Http/Middleware 目录下创建一个新的中间件类OldMiddleware,并且自动生成handle方法 ,在这个中间件中,我们只允许提供的 age 大于 200 的访问路由,否则,我们将用户重定向到主页:

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class OldMiddleware
  5. {
  6. /**
  7. * 返回请求过滤器
  8. *
  9. * @param \Illuminate\Http\Request $request
  10. * @param \Closure $next
  11. * @return mixed
  12. */
  13. public function handle($request, Closure $next)
  14. {
  15. if ($request->input('age') <= 200) {
  16. return redirect('home');
  17. }
  18. return $next($request);
  19. }
  20. }  

理解中间件的最好方式就是将中间件看做 HTTP 请求到达目标之前必须经过的“层”,每一层都会检查请求甚至会完全拒绝它

2.中间件之前/之后

  1. a.请求前处理
  2. class BeforeMiddleware
  3. {
  4. public function handle($request, Closure $next)
  5. {
  6. // 执行动作
  7. return $next($request);
  8. }
  9. }
  10.  
  11. b.请求后处理
  12. class AfterMiddleware
  13. {
  14. public function handle($request, Closure $next)
  15. {
  16. $response = $next($request);
  17. // 执行动作
  18. return $response;
  19. }
  20. }

  

三.使用中间件

要想让中间件起作用,必须要注册中间件.

1.全局注册
如果你想要中间件在每一个 HTTP 请求期间被执行,,只需要将相应的中间件类放到app/Http/Kernel.php 的数组属性$middleware 中即可

2.在路由和控制器中使用中间件(局部)
a.首先应该在app/Http/Kernel.php 文件中分配给该中间件一个简写的 key,默认情况下,该类的$routeMiddleware 属性包含了 Laravel 内置的入口中间件,添加你自己的中间件只需要将其追加到后面并为其分配一个 key:

  1. protected $routeMiddleware = [
  2. 'auth' => \App\Http\Middleware\Authenticate::class,
  3. 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
  4. 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
  5. 'test' => \App\Http\Middleware\TestMiddleware::class,
  6. ];

  

b.在路由中使用

Route::get('admin/profile', ['middleware' => 'test', function () {}]);

或者

Route::get('admin/profile', ['middleware' => 'test', 'IndexController@index']);

c.在控制器中使用

$this->middleware('auth');

四.中间件参数

中间件还可以接收额外的自定义参数,比如,如果应用需要在执行动作之前验证认证用户是否拥有指定的角色,可以创建一个RoleMiddleware 来接收角色名作为额外参数。 额外的中间件参数会在$next 参数之后传入中间件:

  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class RoleMiddleware
  5. {
  6. /**
  7. * 运行请求过滤器
  8. *
  9. * @param \Illuminate\Http\Request $request
  10. * @param \Closure $next
  11. * @param string $role
  12. * @return mixed
  13. * translator http://laravelacademy.org
  14. */
  15. public function handle($request, Closure $next, $role)
  16. {
  17. if (! $request->user()->hasRole($role)) {
  18. // Redirect...
  19. }
  20. return $next($request);
  21. }
  22. }

  

中间件参数可以在定义路由时通过:分隔中间件名和参数名来指定,多个中间件参数可以通过逗号分隔:

  1. Route::put('post/{id}', ['middleware' => 'role:editor', function ($id) {
  2. //
  3. }]);

  

五.可终止的中间件

有时候中间件可能需要在 HTTP 响应发送到浏览器之后做一些工作。比如,Laravel 内置的“session”中间件会在响应发送到浏览器之后将 session 数据写到存储器中,为了实现这个,定义一个可终止的中间件并添加terminate 方法到这个中间件:

  1. <?php
  2. namespace Illuminate\Session\Middleware;
  3. use Closure;
  4. class StartSession
  5. {
  6. public function handle($request, Closure $next)
  7. {
  8. return $next($request);
  9. }
  10. public function terminate($request, $response)
  11. {
  12. // 存储 session 数据...
  13. }
  14. }

  

terminate 方法将会接收请求和响应作为参数。一旦你定义了一个可终止的中间件,应该将其加入到 HTTP kernel 的全局中间件列表中。 当调用中间件上的terminate 方法时,Laravel 将会从服务容器中取出该中间件的新的实例,如果你想要在调用handle 和terminate 方法时使用同一个中间件实例,则需要使用容器的singleton 方法将该中间件注册到容器中。

Laravel之中间件的更多相关文章

  1. Laravel 使用中间件进行权限控制

    Laravel 使用中间件进行权限控制 飞凡的陀螺 关注 2018.01.24 17:45 字数 264 阅读 1138评论 0喜欢 1 先看 文档Laravel 中间件提供了一种方便的机制来过滤进入 ...

  2. laravel StartSession中间件的实现原理

    1. 打开app\Http\Kernel.php,找到StartSession的位置.这里要说一下,middleware中的中间件是都会被执行的,但执行的顺序我不知道,还需看源码来实现 protect ...

  3. laravel的中间件创建思路

    网上有很多解析laravel中间件的实现原理,但是不知道有没有读者在读的时候不明白,作者是怎么想到要用array_reduce函数的? 本文从自己的角度出发,模拟了如果我是作者,我是怎么实现这个中间件 ...

  4. 深入解析Laravel的中间件

    Laravel 中间件是什么? 简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作. 我们可以通过中间件实现以下功能: 指定某些路由 设置 HTT ...

  5. laravel 加中间件的方法 防止直接打开后台

    路由 routes.php Route::group(['middleware' => ['web','admin.login.login']], function () { //后台首页路由 ...

  6. Laravel 5 中间件、路由群组、子域名路由、 权限控制的基本使用方法

    创建控制器: php artisan make:controller Admin/IndexController 创建Middleware: php artisan make:middleware T ...

  7. Laravel 利用中间件控制权限。

    1.把所有需要控制的url写到config/admin.php里. 2.http/kernel.php文件里加上中间件. 3.http/Middleware/Permission.php 4.视图层

  8. laravel在中间件内生成的变量如何传到控制器

    在中间件内获取到一个变量,如何返回到控制器中并使用这个变量! 做了个demo: // web.php Route::get('/check', 'CheckController@check')-> ...

  9. laravel 拾遗 中间件

    Problem You want to add middleware to your application but don't know where to begin.     Solution C ...

随机推荐

  1. codeforces gym/100814 humming distance (二进制位数比较)

    Gym - 100814I I. Salem time limit per test 1 second memory limit per test 1024 megabytes input stand ...

  2. JS与jQuery中html-与-text方法的区别

    所有的实例均用下面的html <div id="id0"> <div id="id1"> 直接text <p> <sp ...

  3. 疫情控制(NOIP2012)庆祝2012满贯!٩(๑•◡-๑)۶ⒽⓤⒼ

    丧病至极的D2T3啊! 好吧~ 先放个传送门~ 原题传送门 好吧,这道题呢.. 根据题意我们可以很明显的看出来 军队往上走的越多(在没到根节点之前),效益一定越大.. 所以可以分情况讨论: 对于无法走 ...

  4. VC++中有关句柄和指针及其转换(转)

    原文转自 https://blog.csdn.net/jearmy/article/details/47030011 1.MFC窗口的句柄和指针的转换 (1) 一般窗口对象都会有一个其对应的句柄变量, ...

  5. linux日志服务之logwatch

    因为logwatch默认要使用sendmail服务,所以请参考linux之发送邮件--sendmail服务配置首先设置正确sendmail服务. 安装logwatch. 查看logwatch文件在/e ...

  6. flask框架下的jinja2模板引擎(3)(模板继承与可以在模板使用的变量、方法)

    flask 框架下的jinja2模块引擎(1):https://www.cnblogs.com/chichung/p/9774556.html flask 框架下的jinja2模块引擎(2):http ...

  7. input 限制输入字段总结

    把输入框中 输入的字符串含有中文逗号 改成 英文逗号 举例: <input type="text" id="keywords" style="w ...

  8. 51nod 1432 独木舟【贪心】

    1432 独木舟 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 n个人,已知每个人体重.独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两 ...

  9. 动态读取cron表达式

    项目中在使用任务调度时往往会用到cron表达式,比如每五分钟执行一次,每天12点执行一次,每周四凌晨1点执行一次等.但是如果将cron表达式写死,往往不利于测试.解决方案:我们可以将cron表达式写入 ...

  10. [BZOJ 4031] 小Z的房间

    Link: BZOJ 4031 传送门 Solution: 矩阵树定理的模板题 看完下面两篇文章就会啦: 周冬论文:https://wenku.baidu.com/view/872eb02de2bd9 ...