当前位置:首页 > 开始使用Lumen吧 - 中间件(Middleware)

开始使用Lumen吧 - 中间件(Middleware)

发布于 2018-05-04 阅读 1372 次 框架 Lumen PHP

中间件是用来处理和过滤拦截进入应用程序的 HTTP 请求

中间件流程图

它就像一层防火墙,在保护着我们的框架内核应用。
通过中间件,我们可以做登录身份验证,路由权限,请求日志等等。而且还不需要入侵 Controller

定义中间件(Middleware)

app/Http/Middleware目录新建 SecurityMiddleware.php 安全验证中间件,用来保护后台 Admin 模块

  1. <?php
  2. /**
  3. * SecurityMiddleware.php
  4. *
  5. * 后台模块安全保护中间件
  6. *
  7. * PHP version 7
  8. *
  9. * @category PHP
  10. * @package lumen
  11. * @author W2LE
  12. * @copyright 2018/5/4
  13. */
  14. namespace App\Http\Middleware;
  15. use Closure;
  16. use App\Models\User;
  17. class SecurityMiddleware
  18. {
  19. /**
  20. * Handle an incoming request.
  21. *
  22. * @param \Illuminate\Http\Request $request
  23. * @param \Closure $next
  24. * @return mixed
  25. */
  26. public function handle($request, Closure $next)
  27. {
  28. // 判断是否为后台 Amdin 模块
  29. if(!$request->is('admin/*')) {
  30. return $next($request);
  31. }
  32. // 获取登陆用户信息
  33. $user = User::find($uid);
  34. // 判断是否为管理员身份
  35. if(!$user->administrator) {
  36. // 非管理员无法访问 Admin 模块
  37. return redirect('/');
  38. }
  39. return $next($request);
  40. }
  41. }

中间件注册

定义好中间件后,我们需要把定义的中间件注册到我们的服务中,Lumen 提供的中间件注册有两种模式

  • 全局中间件
  • 局部中间件

全局中间件

注册全局中间件后,所有的路由都需要先经过全局中间件处理

app/bootstrap/app

  1. /*
  2. |--------------------------------------------------------------------------
  3. | Register Middleware
  4. |--------------------------------------------------------------------------
  5. |
  6. | Next, we will register the middleware with the application. These can
  7. | be global middleware that run before and after each request into a
  8. | route or middleware that'll be assigned to some specific routes.
  9. |
  10. */
  11. $app->middleware([
  12. App\Http\Middleware\SecurityMiddleware::class,
  13. ]);
  14. // 如果有多个中间件,依次添加即可。
  15. // 中间件执行顺序是从上往下,依次执行

局部中间件

注册

  1. /*
  2. |--------------------------------------------------------------------------
  3. | Register Middleware
  4. |--------------------------------------------------------------------------
  5. |
  6. | Next, we will register the middleware with the application. These can
  7. | be global middleware that run before and after each request into a
  8. | route or middleware that'll be assigned to some specific routes.
  9. |
  10. */
  11. // 注册一个 admin.security 后台模块安全认证中间件
  12. $app->routeMiddleware([
  13. 'admin.security' => App\Http\Middleware\SecurityMiddleware::class,
  14. ]);

添加局部中间件,局部中间件需要在路由中指定

  1. $router->get('admin/profile', ['middleware' => 'admin.security', 'Admin\ProfileController@Index']);

前置/后置 中间件(Before / After Middleware)

前置中间件(Before Middleware)

前置中间件意思是在 HTTP 请求进入前经过的中间件
默认情况下,定义的中间件都是前置中间件,如我们上面定义的 SecurityMiddleware 后台安全身份认证中间件。

后置中间件(After Middleware)
后置中间件刚好与前置中间件相对;是指在 HTTP 离开应用后经过的中间件

  1. <?php
  2. /**
  3. * AfterMiddleware.php
  4. *
  5. * PHP version 7
  6. *
  7. * @category PHP
  8. * @package lumen
  9. * @author W2LE
  10. * @copyright 2018/5/3
  11. */
  12. namespace App\Http\Middleware;
  13. use Closure;
  14. class AfterMiddleware
  15. {
  16. /**
  17. * Handle an incoming request.
  18. *
  19. * @param \Illuminate\Http\Request $request
  20. * @param \Closure $next
  21. * @return mixed
  22. */
  23. public function handle($request, Closure $next)
  24. {
  25. // 与前置中间件不同的是,在定义的不同之处
  26. $response = $next($request);
  27. // 在此处理后置中间件的业务逻辑
  28. // 比如设置跨域的 header
  29. header('Access-Control-Allow-Origin:*');
  30. ...
  31. return $response;
  32. }
  33. }

简单来说“在 $next 前处理业务就是前置,在之后处理就是后置”。也可以合在一起:

  1. // 前置业务
  2. ...
  3. $response = $next($request);
  4. // 后置业务
  5. ...
  6. return $response;

给中间件传递参数

在路由中通过 :param 方式添加参数:

  1. $router->get('admin/profile', ['middleware' => 'admin.security:safe', 'Admin\ProfileController@Index']);

参数获取:需要在中间件handle方法中添加接收参数

  1. /**
  2. * Handle an incoming request.
  3. *
  4. * @param \Illuminate\Http\Request $request
  5. * @param \Closure $next
  6. * @param $param 用来接收 route 中传递的参数
  7. * @return mixed
  8. */
  9. public function handle($request, Closure $next$param)
  10. {
  11. if($param == 'safe') {
  12. // 处理业务
  13. }
  14. }