Code前端首页关于Code前端联系我们

Laravel 路由聚合规则:中间件、子域名、路由前缀和命名空间

terry 2年前 (2023-09-25) 阅读数 51 #后端开发

Laravel 路由分组规则:中间件、子域名、路由前缀和命名空间

在日常开发中,我们通常会聚合具有某些共同特征的路由,包括是否需要身份验证、是否共享路由前缀或子域名、是否具有相同的控制器命名空间等。显然,通过根据共同特征对路由进行分组,我们可以避免为特定路由多次定义相同的路由特征,使代码更加简洁、可读、可维护。更好的。

所谓的路由分组,其实就是通过Route::group将多条路由进行分组,然后应用相应的共享函数:

Route::group([], function () { 
    Route::get('hello', function () { return 'Hello'; }); 
    Route::get('world', function () { return 'World'; }); 
});

由于没有使用共享函数(第一个参数为空矩阵) ),所以这样的路由分组实际上是没有意义的。下面介绍一下共享功能的一些常用设置。

中间件

我们使用路由聚合时最常见的场景可能是对一组路由使用通用中间件。对于中间件,可以参考官方文档。稍后还将提供单独的解释章节。使用中间件可以过滤或重定向 HTTP 请求,例如身份验证中间件(别名 auth )。如果用户已通过身份验证,则可以进行后处理,否则用户将被重定向到登录页面。

让我们创建一个包含 仪表板accou nt 的指导组。两个路由都需要认证,所以我们可以通过 Route::middleware为它们设置一个通用的中间件 auth,并相应组合:

Route::middleware('auth')->group(function () {
    Route::get('dashboard', function () {
        return view('dashboard');
    });
    Route::get('account', function () {
        return view('account');
    });
});

如果有多个中间件,可以传递参数通过像 ['auth', 'other'] 这样的数组,上面是 Laravel 5.5+ 提供的新语法。在这个版本之前,你必须这样调用:

Route::group(['middleware' => 'auth'], function () { 
    Route::get('dashboard', function () { 
        return view('dashboard'); 
    }); 
    Route::get('account', function () { 
        return view('account'); 
    }); 
});

当然,链式调用只是语法糖,底层最终是下面的 Path:: 这个组定义 被实现了。有兴趣的同学可以看看源码是如何实现的:vendor/laravel/framework/src/Illuminate/Routing/,下面的路由前缀、子域名和命名空间链式调用的原理相同。将来,我们将用链式调用来定义它们,因为代码更具可读性。

路由前缀

如果某些路由有共同的路由前缀,例如所有API路由都以前缀/api开头,我们可以使用 Route::prefix 指定该组路径的路由前缀并对其进行分组:

Route::prefix('api')->group(function () {
    Route::get('/', function () {
        // 处理 /api 路由
    })->name('');
    Route::get('users', function () {
        // 处理 /api/users 路由
    })->name('');
});

子域名路径

子域名路径与路由路径前缀相同,但组路径受子域名而不是路径前缀的限制。子域名路径有使用场景有两种,一种是为应用子系统设置不同的子域名:

Route::domain('')->group(function () {
    Route::get('/', function () {
        // 处理 http:// 路由
    });
});

另一种是通过参数设置子域名,适合网站有多个租户的场景(比如天猫、最著名商家都有自己独立的名称子域如):

Route::domain('{account}.')->group(function () {
    Route::get('/', function ($account) {
        //
    });
    Route::get('user/{id}', function ($account, $id) {
        //
    });
});

在这种情况下,$account始终是所有数据包路由的第一个路由参数。

子命名空间

在控制器模式下定义路径时,当我们没有显式指定控制器命名空间时,默认命名空间为App\Http\Controllers(位于app/Providers/) ),如果某些控制器位于该命名空间下的子命名空间中,如何设置分组规则?我们可以通过Route::namespace为同一个子空间下的聚合路由设置一个公共子空间:

Route::get('/', 'Controller@index');

Route::namespace('Admin')->group(function() {
     // App\Http\Controllers\Admin\AdminController
     Route::get('/admin', 'AdminController@index');
});

路由命名前缀

除了通过上述共同特征对路由进行分组之外,对于特定类型的资源路由(例如 users )通常具有相同的路径命名前缀,例如 user.。还可以基于此功能对路由进行分组,使用 Route::name 方法可以实现:

// 路由命名+路径前缀
Route::name('user.')->prefix('user')->group(function () {
    Route::get('{id?}', function ($id = 1) {
        // 处理 /user/{id} 路由,路由命名为 
        return route('');
    })->name('show');
    Route::get('posts', function () {
        // 处理 /user/posts 路由,路由命名为 
    })->name('posts');
});

本例中我们使用两个常用的功能:路由名称前缀和路由路由前缀通过链对路由进行分组来电。以上五个函数也可以组合调用,通过调用 方法参考上面的链式调用来组合更复杂的分组规则。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门