Laravel - 中间件:请求处理的门户

你好,未来的 Laravel 开发者们!今天,我们将深入 Laravel 中间件的迷人世界。把中间件想象成你应用程序的贴心保安——它在请求到达你的主要应用程序逻辑之前进行检查和处理。让我们一起踏上这段激动人心的旅程!

Laravel - Middleware

什么是中间件?

在深入代码之前,让我们先了解一下中间件是什么。想象你在举办一个派对(你的应用程序),门口有一个保安(中间件)。这个保安可以:

  1. 检查人们是否在宾客名单上(身份验证)
  2. 确保他们穿着得体(验证)
  3. 给他们一个手环(向请求中添加信息)
  4. 或者甚至拒绝他们入内(终止请求)

这正是中间件为你的 Laravel 应用程序所做的!

注册中间件

现在,让我们看看如何创建和注册我们自己的中间件。

创建中间件

首先,我们将创建一个简单的中间件来检查用户是否年满18岁:

<?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岁。如果没有,它将重定向到主页。否则,它将请求传递给下一个中间件或主应用程序。

注册全局中间件

要全局使用这个中间件(对所有路由),我们需要在 app/Http/Kernel.php 文件中注册它:

protected $middleware = [
// ...
\App\Http\Middleware\CheckAge::class,
];

注册路由中间件

如果你只想为特定路由使用中间件,你可以将其注册为路由中间件:

protected $routeMiddleware = [
// ...
'checkage' => \App\Http\Middleware\CheckAge::class,
];

然后,你可以像这样在路由中使用它:

Route::get('adult-only', function () {
//
})->middleware('checkage');

中间件参数

有时,我们希望中间件更具灵活性。这时,中间件参数就派上用场了!

让我们修改 CheckAge 中间件,使其接受一个最小年龄参数:

<?php

namespace App\Http\Middleware;

use Closure;

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

return $next($request);
}
}

现在,我们可以使用这个中间件设置不同的年龄限制:

Route::get('adult-only', function () {
//
})->middleware('checkage:18');

Route::get('senior-only', function () {
//
})->middleware('checkage:65');

这难道不酷吗?我们已经使中间件在不同场景下可重用!

可终止的中间件

有时,我们希望在响应发送到浏览器后,中间件能做一些事情。这时,可终止的中间件就派上用场了!

让我们创建一个记录响应时间的中间件:

<?php

namespace App\Http\Middleware;

use Closure;

class LogResponseTime
{
public function handle($request, Closure $next)
{
$request->start_time = microtime(true);

return $next($request);
}

public function terminate($request, $response)
{
$duration = microtime(true) - $request->start_time;
\Log::info('响应时间:' . $duration . ' 秒');
}
}

这个中间件向请求添加了一个 start_time,然后在响应发送后记录总响应时间。

要使用可终止的中间件,确保它在 app/Http/Kernel.php 文件中注册:

protected $middleware = [
// ...
\App\Http\Middleware\LogResponseTime::class,
];

中间件方法

下面是你在使用中间件时将使用的主要方法表格:

方法 描述
handle() 主要的中间件逻辑。处理请求并可选地传递给下一个中间件。
terminate() 在响应发送到浏览器后运行。用于清理或日志记录。

结论

就这样,朋友们!我们已经穿越了 Laravel 中间件的土地,从创建和注册中间件到使用参数和可终止的中间件。记住,中间件就像是请求处理的瑞士军刀——它多功能、强大,是你 Laravel 工具箱中的必备工具。

在你继续 Laravel 的冒险之旅时,你会发现无数创造性地使用中间件的方法。也许你会创建用于检查维护模式、记录请求或甚至转换请求数据的中间件。可能性无穷无尽!

继续编码,继续学习,最重要的是,享受乐趣!下次见,快乐的 Laravel 编程!

Credits: Image by storyset