答案:在Laravel中创建自定义中间件需使用Artisan命令生成文件,在handle方法中编写过滤逻辑,如CheckAge中间件验证请求年龄;接着在Kernel.php的$routeMiddleware数组中注册并设置别名;然后在路由或控制器中通过middleware方法应用该中间件;支持参数传递时可在handle方法增加参数并在使用时传入具体值。
在 Laravel 中创建和注册自定义中间件非常简单,只需几个步骤即可完成。中间件可以用来过滤进入应用的 HTTP 请求,比如权限验证、日志记录、请求修改等。
使用 Artisan 命令行工具生成中间件:
php artisan make:middleware CheckAge
这个命令会在 app/Http/Middleware 目录下生成一个名为 CheckAge.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);
}
}
你可以根据需要修改逻辑。例如上面的例子是检查请求中是否包含 age 参数且大于 18,否则跳转到首页。
中间件需要注册后才能使用,注册方式有三种:全局中间件、路由中间件、路由直接绑定。
(1)注册为路由中间件打开 app/Http/Kernel.php 文件,在 $routeMiddleware 数组中添加你的中间件:
protected $routeMiddleware = [
// 其他中间件...
'check.age' => \App\Http\Middleware\CheckAge::class,
];
这样就可以在路由中通过别名 check.age 使用它。
(2)注册为全局中间件(可选)如果你希望中间件对所有请求生效,可以将其类名加入 $middleware 数组:
protected $middleware = [
// 其他全局中间件...
\App\Http\Middleware\CheckAge::class,
];
一般不建议将业务相关的中间件设为全局,以免影响所有接口。
注册完成后,可以在路由中使用中间件:
Route::get('/profile', function () {
return view('profile');
})->middleware('check.age');
也可以用于控制器:
class ProfileController extends Controller
{
public function __construct()
{
$this->middleware('check.age');
}
}
中间件还支持接收参数,比如限制特定年龄段:
public function handle($request, Closure $next, $minAge)
{
if ($request->age < $minAge) {
return redirect('home');
}
ret
urn $next($request);
}
使用时传参:
middleware('check.age:21')
基本上就这些。创建中间件用 Artisan 命令,注册到 Kernel,然后在路由或控制器中调用即可。逻辑写在 handle 方法里,灵活又方便。