Laravel 5.0 - Middleware (中间件)

图片:http://stackphp.com/

如上图所示,中心的绿色区域是整个应用的核心区域。

所以,中间件就是一系列处理请求和响应的方式而不是你用程序逻辑的一部分。

Laravel 中默认使用中间件处理请求中的加密解密,以及 Cookies 和 Sessions。你也可以自定义自己所需的中间件。

写中间件

artisan make:middleware MyMiddleware

执行上面的命令,生成中间件文件:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

class MyMiddleware implements Middleware {

    /**
    * Handle an incoming request.
    *
    * @param  \Illuminate\Http\Request  $request
    * @param  \Closure  $next
    * @return mixed
    */
    public function handle($request, Closure $next)
    {
        //
    }

}

完善 handle 方法的内容(用请求端口来做个例子):

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

class MyMiddleware implements Middleware {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // Test for an even vs. odd remote port
        if (($request->server->get(‘REMOTE_PORT‘) / 2) % 2 > 0)
        {
            throw new \Exception("WE DON‘T LIKE ODD REMOTE PORTS");
        }

        return $next($request);
    }

}

使用中间件

Laravel 5 中有两种方法加入中间件,都是写在 App\Providers\AppServiceProvider。

默认有两个属性 $middleware$stack ,$stack 里面的中间件是每次响应都会处理,而 $middleware 中的中间件是按需处理。

一帮情况下默认的中间件如下:

protected $stack = [
        ‘App\Http\Middleware\MaintenanceMiddleware‘,
        ‘Illuminate\Cookie\Middleware\Guard‘,
        ‘Illuminate\Cookie\Middleware\Queue‘,
        ‘Illuminate\Session\Middleware\Reader‘,
        ‘Illuminate\Session\Middleware\Writer‘,
    ];

protected $middleware = [
        ‘auth‘ = ‘App\Http\Middleware\AuthMiddleware‘,
        ‘auth.basic‘ => ‘App\Http\Middleware\BasicAuthMiddleware‘,
        ‘csrf‘ => ‘App\Http\Middleware\CsrfMiddleware‘,
        ‘guest‘ => ‘App\Http\Middleware\GuestMiddleware‘,
    ];

中间件每次请求都处理:

protected $stack = [
        ‘App\Http\Middleware\MyMiddleware‘
        ‘App\Http\Middleware\MaintenanceMiddleware‘,
        ‘Illuminate\Cookie\Middleware\Guard‘,
        ‘Illuminate\Cookie\Middleware\Queue‘,
        ‘Illuminate\Session\Middleware\Reader‘,
        ‘Illuminate\Session\Middleware\Writer‘,
    ];

中间件按需处理:

 protected $middleware = [
        ‘auth‘ => ‘App\Http\Middleware\AuthMiddleware‘,
        ‘auth.basic‘ => ‘App\Http\Middleware\BasicAuthMiddleware‘,
        ‘csrf‘ => ‘App\Http\Middleware\CsrfMiddleware‘,
        ‘guest‘ => ‘App\Http\Middleware\GuestMiddleware‘,
        ‘absurd‘ => ‘App\Http\Middleware\MyMiddleware‘,
    ];

中间件路由注释

直接写到控制器类:

/**
 * @Resource("foobar/photos")
 * @Middleware("auth")
 * @Middleware("absurd", except={"update"})
 * @Middleware("csrf", only={"index"})
 */
class FoobarPhotosController
{}

写到方法:

/**
 * @Middleware("auth.basic")
 */
public function index() {}

$this->middleware()

可以在构造函数或者方法内使用 $this->middleware() 来加载相应的中间件。

...
use Illuminate\Routing\Controller;

class AwesomeController extends Controller {

    public function __construct()
    {
        $this->middleware(‘csrf‘);
        $this->middleware(‘auth‘, [‘only‘ => ‘update‘])
    }

}

routes.php 设置中间件

// Routes.php

// Single route
$router->get("/awesome/sauce", "[email protected]", [‘middleware‘ => ‘auth‘]);

// Route group
$router->group([‘middleware‘ => ‘auth‘], function() {
    // lots of routes that require auth middleware
});

响应之前和之后处理

应用程序响应之前和之后的中间件处理:

之前处理:

...
class BeforeMiddleware implements Middleware {

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

}

之后处理:

...
class AfterMiddleware implements Middleware {

    public function handle($request, Closure $next)
    {
        $response = $next($request);
        // Do stuff
        return $response;
    }

}
时间: 2024-12-27 06:27:39

Laravel 5.0 - Middleware (中间件)的相关文章

创建自定义的Middleware中间件

创建自定义的Middleware中间件 阅读目录 何为Middleware中间件 使用Inline方式注册Middleware 使用Inline+ AppFunc方式注册Middleware 定义原生Middleware类的形式来注册Middleware 使用Katana Helper来注册Middleware Middleware的执行顺序 小结 经过前2篇文章的介绍,相信大家已经对OWIN和Katana有了基本的了解,那么这篇文章我将继续OWIN和Katana之旅——创建自定义的Middle

Laravel 权限控制整理--中间件

简介 HTTP 中间件提供一个方便的机制来过滤进入应用程序的 HTTP 请求,例如,Laravel 默认包含了一个中间件来检验用户身份验证,如果用户没有经过身份验证,中间件会将用户导向登录页面,然而,如果用户通过身份验证,中间件将会允许这个请求进一步继续前进. 当然,除了身份验证之外,中间件也可以被用来执行各式各样的任务,CORS 中间件负责替所有即将离开程序的响应加入适当的响应头,一个日志中间件可以记录所有传入应用程序的请求. Laravel 框架已经内置一些中间件,包括维护.身份验证.CSR

ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.ConfigureServices 3.Configure方法

Startup 和 Middleware(中间件)

Startup 和 Middleware(中间件) ASP.NET Core 运行原理剖析2:Startup 和 Middleware(中间件) Startup Class 1.Startup Constructor(构造函数) 2.ConfigureServices 3.Configure方法 Middleware 1.中间件注册 2.常用中间件 在上一节(文章链接)中提到ASP.NET Core WebApp 必须含有Startup类,在本节中将重点讲解Startup类以及Middlewar

Laravel Middleware 中间件笔记

Laravel的中间件可以方便的过滤进入我们网页的请求.包括用户授权,CORS来指定流出请求的header等. 定义一个新的中间件可以使用命令: php artisan make:middleware AgeMiddleware 这条命令在app/Http/Middleware中创建AgeMiddleware类. 我们假设我们过滤所有年龄小于200的请求: <?php namespace App\Http\Middleware; use Closure; class AgeMiddleware

Laravel5.1 Middleware中间件(初级)

中间件?什么鬼? 大家第一次接触这个词都会有这么个疑问,但它其实没那么神秘. 一句话就可以解释它:过滤HTTP请求专用机制. 为什么要使用中间件? 过滤HTTP请求是可以写在别的地方,比如说控制器中 路由中,BUT 抽象出来就有它的理由,比如说Laravel自带的Auth中间件 它要求必须是登录进来的用户才有权访问 如果没有登录就跳转到登录页面,这样的逻辑在很多场景都会用到 这很明显了吧 你不可能在每个控制器或每一个路由都单独实现以便,直接抽出来多方便. 1 使用中间件 1.1 创建中间件 咱创

laravel 5.0 artisan 命令列表(中文简体)

这是 golaravel 社区网友 a939638621 对 laravel 命令行列表的翻译,感谢热心网友的付出. 这些都是我一个翻阅词典查的 ,真心劳动成果.谢谢 提供给那些用的人 某些的用词可能不是很精确,欢迎纠正!!! 感谢本社区提供的 中文版的 laravel 的中文文档!! 所以,有好东西就会放在本社区!!! php artisan list Laravel Framework version 5.0.13 Usage: [options] command [arguments] O

自动挡换手动挡:在 ASP.NET Core 3.0 Middleware 中手动执行 Controller Action

由于遭遇 System.Data.SqlClient 的性能问题(详见之前的博文),向 .NET Core 3.0 的升级工作被迫提前了.在升级过程中遇到了一个问题,我们在 Razor Class Library 中实现的自定义错误页面无法在 ASP.NET Core 3.0 Preview 5 中正常工作,问题原因详见博问 Razor Class Library 中的属性路由在 ASP.NET Core 3.0 中不起作用 . 由于属性路由不起作用的问题没找到解决方法,于是被迫采用了另外一种解

在Laravel中使用Middleware进行身份验证

新建一个中间件: 方法写在handle中 判断用户是否登录而且是否是管理员,不是的话返回到主页 新建判断是否为管理员的方法 在kernel定义一个中间件,key是admin 注册群组路由:prefix是路由前缀,访问路由会自动在前面加上路由前缀:middleware是key值,会去验证中间件 1在数据库中是管理员 成功 附: 注册单个路由的中间件: Route::get('admin/profile', ['middleware' => 'auth', function () { // }]);