📜  laravel 主动路由检查 - PHP (1)

📅  最后修改于: 2023-12-03 15:17:13.590000             🧑  作者: Mango

Laravel 主动路由检查

在 Laravel 中,我们可以使用主动路由检查来检查某个路由实例是否适合处理当前请求。这可以让我们在项目中更灵活地控制路由匹配逻辑,进而实现更加复杂的业务逻辑。

实现方法

在 Laravel 中,我们可以为路由实例添加一个 matches 方法,该方法接收当前请求并返回一个布尔值,表示该实例是否适合处理当前请求。如果返回 true,该路由实例将被匹配;如果返回 false,该路由实例将不会被匹配。

例如,我们希望只有请求路径中包含 admin 的请求才会匹配某个路由实例,我们可以这样写:

Route::get('/admin/dashboard')->matches(function ($request) {
    return Str::contains($request->path(), 'admin');
});

上述代码中,我们为 Route::get('/admin/dashboard') 路由实例添加了一个 matches 方法,该方法接收当前请求并使用 Str::contains 方法检查当前请求路径是否包含 admin。如果是,则返回 true,该路由实例将被匹配。

示例

假设我们的项目中有一个会员中心页面,其中包含了多个子页面,如会员信息、订单列表、购物车等。这些子页面的 URL 地址都以 /dashboard 为前缀,例如 /dashboard/profile/dashboard/orders 等。

我们希望实现以下逻辑:

  1. 如果用户未登录,重定向到登录页面;
  2. 如果用户已登录但未激活,重定向到激活页面;
  3. 如果用户已登录并激活,但该页面需要付费才能查看,重定向到付费页面;
  4. 如果以上条件都满足,正常显示页面。

实现该逻辑的代码如下:

Route::prefix('/dashboard')->group(function () {
    Route::get('/profile')
        ->middleware('auth')
        ->matches(function ($request) {
            $user = $request->user();
            return $user && $user->status === 'active';
        });

    Route::get('/orders')
        ->middleware('auth')
        ->matches(function ($request) {
            $user = $request->user();
            return $user && $user->status === 'active';
        });

    Route::get('/cart')
        ->middleware(['auth', 'verified'])
        ->matches(function ($request) {
            $user = $request->user();
            return $user && $user->status === 'active' && $user->hasPaid();
        });

    // ...
});

上述代码中,我们为子页面路由实例 Route::get('/dashboard/profile')Route::get('/dashboard/orders')Route::get('/dashboard/cart') 分别添加了一个 matches 方法,用于执行前面所述的逻辑。

例如,对于 /dashboard/profile 页面,我们检查当前请求是否满足以下条件:

  1. 用户已登录;
  2. 用户状态为激活。

如果以上条件都满足,该路由实例将被匹配,否则将被忽略。

总结

使用 Laravel 的主动路由检查功能,我们可以更加灵活地控制路由匹配逻辑,以实现复杂的业务逻辑。在实际开发中,我们可以将该功能应用于各种场景,如权限控制、多语言支持、付费内容等。