Laravel5.1学习笔记3 HTTP中间件

HTTP 中间件

简介

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

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

建立中间件

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

php artisan make:middleware OldMiddleware

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

<?php namespace App\Http\Middleware;

use Closure;

class OldMiddleware {

    /**
     * Run the request filter.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($request->input(‘age‘) < 200)
        {
            return redirect(‘home‘);
        }

        return $next($request);
    }

}

如你所见,若是 年龄 小于 200 ,中间件将会返回 HTTP 重定向给客户端,否则,请求将会进一步传递到应用程序。只需调用带有 $request$next 方法,即可将请求传递到更深层的应用程序(允许跳过中间件) HTTP 请求在实际碰触到应用程序之前,最好是可以层层通过许多中间件,每一层都可以对请求进行检查,甚至是完全拒绝请求。

Before / After 中间件

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

<?php namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        // Perform action

        return $next($request);
    }
}

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

<?php namespace App\Http\Middleware;

use Closure;

class AfterMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // Perform action

        return $response;
    }
}

注册中间件

全局中间件

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

指派中间件给路由

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

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

可终止中间件

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

use Closure;
use Illuminate\Contracts\Routing\TerminableMiddleware;

class StartSession implements TerminableMiddleware {

    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store the session data...
    }

}

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

时间: 2024-10-21 11:23:49

Laravel5.1学习笔记3 HTTP中间件的相关文章

《Pro Express.js》学习笔记——app.params中间件

app.param中间件用于对URL中的参数进行获取.加工.输出,提供公有逻辑,以达到代码重构的目的. 以下示例采取三个步骤对代码进行重构,app.param中间件的作用非常明显: 不使用中间件 使用自定义中间件 使用app.param中间件 不使用中间件 1 var users = { 2     'azat': { 3         email: '[email protected]', 4         website: 'http://azat.co', 5         blog

Laravel5.1 学习笔记2, 路由

安装的说明请看文档, laravel 安装 #基本路由 你将在 app/Http/routes.php 文件定义大部分路由, 这些路由将被App\Providers\RouteServiceProvider 类所装载. 最基本的laravel路由仅仅包含一个URI和 闭包. Route::get('/', function () { return 'Hello World';}); Route::post('foo/bar', function () { return 'Hello World'

Laravel5.1学习笔记6 响应

基本响应 附加头信息到响应 附加Cookie到响应 其他响应 View视图响应 JSON响应 File下载 重定向 重定向到命名路由 重定向到控制器Action 附带闪回Session数据重定向 响应宏   #基本响应 从路由返回字串 最基本的响应就是从 Laravel 的路由返回字串: Route::get('/', function(){ return 'Hello World';}); 建立自定义响应 但是以大部分的路由及控制器所执行的动作来说,你需要返回完整的 Illuminate\Ht

Laravel5.1学习笔记19 EloquentORM 入门

Eloquent:入门 简介 定义模型(model) Eloquent Model Conventions Retrieving Multiple Models Retrieving Single Models / Aggregates Retrieving Aggregates Inserting & Updating Models Basic Inserts Basic Updates Mass Assignment Deleting Models Soft Deleting Queryin

Laravel5.1学习笔记23 Eloquent 序列化

Eloquent: Serialization Introduction Basic Usage Hiding Attributes From JSON Appending Values To JSON Introduction When building JSON APIs, you will often need to convert your models and relationships to arrays or JSON. Eloquent includes convenient m

Laravel5.1学习笔记20 EloquentORM 关系

Eloquent: Relationships Introduction Defining Relationships One To One One To Many Many To Many Has Many Through Polymorphic Relations Many To Many Polymorphic Relations Querying Relations Eager Loading Constraining Eager Loads Lazy Eager Loading Ins

Laravel5.1学习笔记22 Eloquent 调整修改

Eloquent: Mutators Introduction Accessors & Mutators Date Mutators Attribute Casting Introduction Accessors and mutators allow you to format Eloquent attributes when retrieving them from a model or setting their value. For example, you may want to us

Laravel5.1学习笔记21 EloquentORM 集合

Eloquent: Collections Introduction Available Methods Custom Collections Introduction All multi-result sets returned by Eloquent are an instance of theIlluminate\Database\Eloquent\Collection object, including results retrieved via the get method or ac

Laravel5.1学习笔记7 视图

视图 (View) 基本用法 传递数据到视图 在多个视图中分享数据 视图组件   #基本用法 视图里面包含了你应用程序所提供的 HTML 代码,并且提供一个简单的方式来分离控制器和网页呈现上的逻辑.视图被保存在 resources/views 文件夹内. 一个简单的视图看起来可能像这样: <!-- 视图被保存在 resources/views/greeting.php --> <html> <body> <h1>Hello, <?php echo $n