QQ登录

只需一步,快速开始

扫一扫,访问微社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1592|回复: 1

[PHP开发] Laravel 5.0 - Middleware (中间件)

[复制链接]

174

主题

191

帖子

726

积分

注册会员

Rank: 2

积分
726
发表于 2015-10-22 14:32:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如上图所示,中心的绿色区域是整个应用的核心区域。
所以,中间件就是一系列处理请求和响应的方式而不是你用程序逻辑的一部分。
Laravel 中默认使用中间件处理请求中的加密解密,以及 Cookies 和 Sessions。你也可以自定义自己所需的中间件。
写中间件
artisan make:middleware MyMiddleware
执行上面的命令,生成中间件文件:
  1. <?php namespace App\Http\Middleware;

  2. use Closure;
  3. use Illuminate\Contracts\Routing\Middleware;

  4. class MyMiddleware implements Middleware {

  5.     /**
  6.     * Handle an incoming request.
  7.     *
  8.     * @param  \Illuminate\Http\Request  $request
  9.     * @param  \Closure  $next
  10.     * @return mixed
  11.     */
  12.     public function handle($request, Closure $next)
  13.     {
  14.         //
  15.     }

  16. }
复制代码
完善 handle 方法的内容(用请求端口来做个例子):
  1. <?php namespace App\Http\Middleware;

  2. use Closure;
  3. use Illuminate\Contracts\Routing\Middleware;

  4. class MyMiddleware implements Middleware {

  5.     /**
  6.      * Handle an incoming request.
  7.      *
  8.      * @param  \Illuminate\Http\Request  $request
  9.      * @param  \Closure  $next
  10.      * @return mixed
  11.      */
  12.     public function handle($request, Closure $next)
  13.     {
  14.         // Test for an even vs. odd remote port
  15.         if (($request->server->get('REMOTE_PORT') / 2) % 2 > 0)
  16.         {
  17.             throw new \Exception("WE DON'T LIKE ODD REMOTE PORTS");
  18.         }

  19.         return $next($request);
  20.     }

  21. }
复制代码
使用中间件
Laravel 5 中有两种方法加入中间件,都是写在 App\Providers\AppServiceProvider。
默认有两个属性 $middleware 和 $stack ,$stack 里面的中间件是每次响应都会处理,而 $middleware 中的中间件是按需处理。
一帮情况下默认的中间件如下:
  1. protected $stack = [
  2.         'App\Http\Middleware\MaintenanceMiddleware',
  3.         'Illuminate\Cookie\Middleware\Guard',
  4.         'Illuminate\Cookie\Middleware\Queue',
  5.         'Illuminate\Session\Middleware\Reader',
  6.         'Illuminate\Session\Middleware\Writer',
  7.     ];

  8. protected $middleware = [
  9.         'auth' = 'App\Http\Middleware\AuthMiddleware',
  10.         'auth.basic' => 'App\Http\Middleware\BasicAuthMiddleware',
  11.         'csrf' => 'App\Http\Middleware\CsrfMiddleware',
  12.         'guest' => 'App\Http\Middleware\GuestMiddleware',
  13.     ];
复制代码
中间件每次请求都处理:
  1. protected $stack = [
  2.         'App\Http\Middleware\MyMiddleware'
  3.         'App\Http\Middleware\MaintenanceMiddleware',
  4.         'Illuminate\Cookie\Middleware\Guard',
  5.         'Illuminate\Cookie\Middleware\Queue',
  6.         'Illuminate\Session\Middleware\Reader',
  7.         'Illuminate\Session\Middleware\Writer',
  8.     ];
复制代码
中间件按需处理:
  1. protected $middleware = [
  2.         'auth' => 'App\Http\Middleware\AuthMiddleware',
  3.         'auth.basic' => 'App\Http\Middleware\BasicAuthMiddleware',
  4.         'csrf' => 'App\Http\Middleware\CsrfMiddleware',
  5.         'guest' => 'App\Http\Middleware\GuestMiddleware',
  6.         'absurd' => 'App\Http\Middleware\MyMiddleware',
  7.     ];
复制代码
中间件路由注释
直接写到控制器类:
  1. /**
  2. * @Resource("foobar/photos")
  3. * @Middleware("auth")
  4. * @Middleware("absurd", except={"update"})
  5. * @Middleware("csrf", only={"index"})
  6. */
  7. class FoobarPhotosController
  8. {}
复制代码
写到方法:
  1. /**
  2. * @Middleware("auth.basic")
  3. */
  4. public function index() {}
复制代码
$this->middleware()
可以在构造函数或者方法内使用 $this->middleware() 来加载相应的中间件。
  1. ...
  2. use Illuminate\Routing\Controller;

  3. class AwesomeController extends Controller {

  4.     public function __construct()
  5.     {
  6.         $this->middleware('csrf');
  7.         $this->middleware('auth', ['only' => 'update'])
  8.     }

  9. }
复制代码
routes.php 设置中间件
  1. // Routes.php

  2. // Single route
  3. $router->get("/awesome/sauce", "AwesomeController@sauce", ['middleware' => 'auth']);

  4. // Route group
  5. $router->group(['middleware' => 'auth'], function() {
  6.     // lots of routes that require auth middleware
  7. });
复制代码
响应之前和之后处理
应用程序响应之前和之后的中间件处理:
之前处理:
  1. ...
  2. class BeforeMiddleware implements Middleware {

  3.     public function handle($request, Closure $next)
  4.     {
  5.         // Do Stuff
  6.         return $next($request);
  7.     }

  8. }
复制代码
之后处理:
  1. ...
  2. class AfterMiddleware implements Middleware {

  3.     public function handle($request, Closure $next)
  4.     {
  5.         $response = $next($request);
  6.         // Do stuff
  7.         return $response;
  8.     }

  9. }
复制代码


1

主题

4

帖子

19

积分

新手上路

Rank: 1

积分
19
发表于 2016-2-25 14:11:05 | 显示全部楼层
看不懂
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

     
    战略合作|联系方式|广告赞助|商务合作|手机版|小黑屋|( 京ICP备14036609号-6 )

GMT+8, 2018-10-18 02:35

© 2013-2017 Powered by Discuz! X3.3. 本站由 又拍云 提供 CDN 图片存储服务

快速回复 返回顶部 返回列表