您的位置:

Laravel中间件

Laravel中间件提供了一种新的方法来处理HTTP请求,这种方法有助于保持应用程序的可维护性和可扩展性,使开发人员能够专注于业务逻辑而不是处理请求的细节。接下来我们将从多个方面来详细阐述Laravel中间件。

一、中间件的基本概念

中间件可以看做是在请求到达控制器之前或之后执行的代码。它们提供了一种方法来处理请求的细节,例如身份验证、日志记录和请求过滤。这些中间件独立于控制器、路由和请求处理流程,并可以被应用于多个路由和控制器。

在Laravel中,中间件可以由全局中间件、路由中间件和基于控制器的中间件组成。全局中间件可以用于整个应用程序,路由中间件可以用于特定的路由,基于控制器的中间件可以用于特定的控制器。

下面是一个简单的中间件例子:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function handle($request, Closure $next)
    {
        if ($request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

在这个例子中,我们定义了一个CheckAge中间件,会判断来到的请求中是否带有age参数,如果没有或小于18,会进行重定向,否则就通过中间件继续处理。

二、路由中的中间件

我们可以在路由中使用中间件,来在控制器处理请求前执行代码,例如验证用户的身份、授权到访问等。在Laravel中,路由中的中间件可以在中间键数组中指定。

可以使用路由名称绑定中间件,这样可以方便的在修改路由时不用修改中间件信息,如下:

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

可以使用数组绑定多个中间件:

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

也可以在路由实例上使用middleware方法来绑定中间件:

$route->middleware('auth');

三、全局中间件

全局中间件会对每一个通过应用程序的请求都进行处理。这使得开发人员可以轻松地添加由框架提供的功能,如响应压缩和HTTPS重定向。Laravel已经默认为你定义了很多中间件,你可以在app/Http/Kernel.php找到它们。

你可以在Kernel.php 中的$middleware属性中注册全局中间件:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \Illuminate\Foundation\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    // ...
];

你也可以在Kernel.php中的 $middlewareGroups 属性中注册中间件组。Laravel默认有web和api两个中间件组。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // ...
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],
];

四、基于控制器的中间件

除了路由中的中间件外,Laravel还提供了可以在控制器中使用的中间件。这些中间件可以让你在特定控制器之前或之后对请求进行过滤或处理。

可以将中间件应用于控制器,例如:

namespace App\Http\Controllers;

use App\Http\Middleware\CheckAge;

class UserController extends Controller
{
    /**
     * Instantiate a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware(CheckAge::class);
    }
}

在这个例子中,我们使用了刚才定义的CheckAge中间件来检查用户的年龄。我们在UserController的构造函数中调用了middleware方法,传递一个CheckAge实例作为参数。从而将中间件应用于这个控制器。

五、中间件的优先级

路由中间件、全局中间件的优先级可以在应用程序的核心中间件管理器(app/Http/Kernel.php)中指定,这使开发人员可以管理它们的中间件执行顺序。当多个中间件被应用到同一个请求时,这些中间件将按照它们在应用程序的核心中间件管理器中定义的顺序被调用。

protected $middlewarePriority = [
    \Illuminate\Auth\Middleware\Authenticate::class,
    \Illuminate\Session\Middleware\StartSession::class,
    \Illuminate\Routing\Middleware\ThrottleRequests::class,
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
    // ...
];

六、自定义中间件

当Laravel默认提供的中间件无法满足您的需求时,您可以轻松地创建自己的中间件。Laravel使创建中间件变得非常容易,只需执行命令即可:

php artisan make:middleware CheckAge

这将在app/Http/Middleware目录下创建匿名CheckAge PHP类。Laravel帮助您执行所有基本的类安装,让您可以立即开始编写中间件的代码。在handle方法中实现这个中间件:

public function handle($request, Closure $next)
{
    if ($request->age < 18) {
        return redirect('home');
    }

    return $next($request);
}

你也可以在constructor中注入刚才定义的CheckAge中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class CheckAge
{
    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function handle($request, Closure $next)
    {
        if ($this->request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

完整的自定义中间件例子:

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class CheckAge
{
    protected $request;

    public function __construct(Request $request)
    {
        $this->request = $request;
    }

    public function handle($request, Closure $next)
    {
        if ($this->request->age < 18) {
            return redirect('home');
        }

        return $next($request);
    }
}

七、总结

本文详细阐述了Laravel中间件的概念、路由中间件、全局中间件、基于控制器的中间件、中间件的优先级和自定义中间件。中间件提供了一种新的方法来处理HTTP请求,使得开发更加便捷和可维护。