美文网首页
2018-01-07

2018-01-07

作者: 不欺少年穷 | 来源:发表于2018-01-07 01:54 被阅读11次

    简介

    HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进。

    当然,除了身份验证之外,中间件也可以被用来执行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的响应头,一个日志中间件可以记录所有传入应用程序的请求。 Laravel 框架已经内置一些中间件,包括维护、身份验证、CSRF 保护,等等。所有的中间件都位于 app/Http/Middleware 目录内。

    理解:假设你的应用——路由,控制器,业务逻辑——是图中的绿色部分,从图中可以清晰地看到,用户请求先经由多个中间层才能到达你的应用,然后再经由更多的中间层进行处理。每个特定的中间层都可以在应用逻辑之前、之后进行处理,或者同时在应用逻辑之前和之后进行处理。 

    这就是 middleware 实现修饰模式的工作方式:它捕获请求,做一些处理,然后把处理后的请求对象返回给下一个堆栈层。

    Laravel 默认使用 middleware 来处理加密/解密和 cookies 队列、读取和写入 sessions, 但除此之外你还可以用 middleware 来向请求/响应环中加入你需要的任何一种操作层。比如速率限制、自定义请求解析等。

    创建

    要建立一个新的中间件,可以使用 make:middleware 这个 Artisan 命令:

    phpartisanmake:middlewareOldMiddleware

    1

    此命令将会 在 app/Http/Middleware 目录内置立一个名称为 OldMiddleware 的类。在这个中间件内我们只允许 年龄 大于 200 的才能访问路由,否则,我们会将用户重新导向 「home」 的 URI。

    input('age') <200)        {returnredirect('home');        }return$next($request);    }}

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    如你所见,所有 middleware 的基础是 handle 方法,它接受两个参数:

    $request : Illuminate Request 对象

    $next : Closure(匿名函数), 该函数把 request 对象传递给后续的 middleware

    其实也就是实现了filter的作用。

    Before / After 中间件

    在一个请求前后指定某个中间件取决于这个中间件自身。这个中间件可以执行在请求前执行一些 前置 操作:

    1

    2

    3

    4

    5

    6

    7

    8

    然后,这个中间件也可以在请求后执行一些 后置 操作:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    注册/使用中间件

    1. 全局中间件

    若是希望中间件被所有的 HTTP 请求给执行,只要将中间件的类加入到 app/Http/Kernel.php 的 $middleware 属性清单列表中。

    /**  * The application's global HTTP middleware stack.  *  * @var array  */  protected$middleware =['Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',    'Illuminate\Cookie\Middleware\EncryptCookies',    'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',    'Illuminate\Session\Middleware\StartSession',    'Illuminate\View\Middleware\ShareErrorsFromSession',    'App\Http\Middleware\VerifyCsrfToken',    'App\Http\Middleware\OldMiddleware',  //注册使用];

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    2.指派中间件给路由

    如果你要指派中间件给特定的路由,你得先将中间件在 app/Http/Kernel.php 配置一个键值,默认情况下,这个文件内的 $routeMiddleware 属性已包含了 Laravel 目前配置的中间件,你只需要在清单列表中加上一组自定义的键值即可。 中间件一旦在 HTTP kernel 文件内被定义,你即可在路由选项内使用 middleware 键值来指派。

    protected$routeMiddleware= ['auth'=>'App\Http\Middleware\Authenticate','auth.basic'=>'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth','guest'=>'App\Http\Middleware\RedirectIfAuthenticated'];

    1

    2

    3

    4

    5

    2. 路由使用中间件

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

    1

    2

    3

    4

    3. 控制器中使用中间件

    ...useIlluminate\Routing\Controller;classAwesomeControllerextendsController{publicfunction__construct(){$this->middleware('csrf');$this->middleware('auth', ['only'=>'update'])  }}

    1

    2

    3

    4

    5

    6

    7

    8

    9

    可终止中间件

    有些时候中间件需要在 HTTP 响应已被发送到用户端之后才执行,例如,Laravel 内置的「session」中间件,保存session数据是在响应已被发送到用户端 之后 才执行。为了做到这一点,你需要定义中间件为「可终止的」。

    useClosure;useIlluminate\Contracts\Routing\TerminableMiddleware;classStartSessionimplementsTerminableMiddleware{publicfunctionhandle($request, Closure$next){return$next($request);    }publicfunctionterminate($request,$response){// Store the session data...}}

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    如你所见,除了定义 handle 方法之外, TerminableMiddleware 定义一个 terminate 方法。这个方法接收请求和响应。一旦定义了 terminable 中间件,你需要将它增加到 HTTP kernel 文件的全局中间件清单列表中。

    相关文章

      网友评论

          本文标题:2018-01-07

          本文链接:https://www.haomeiwen.com/subject/ecaunxtx.html