在一个大型的 Laravel 项目中,路由文件可能会变得非常繁琐。随着路由规则的不断增多,最终我们不得不通过搜索路由文件才能找到想要的内容。那么在大型 Laravel 项目中有没有更好的路由管理办法呢?

您可以通过下面的方式之一来解决这个问题,具体取决于您希望如何处理这个问题。在本教程中,我将介绍一些我见过的选项,然后说明我如何处理这个问题以及为什么我会这样处理它。

想象一下,我们正在构建一个 API 应用程序,允许客户从目录中在线订购并使他们的客户能够跟踪发货。

路由服务提供者

使用路由服务提供者,您可以轻松添加额外的路由条目。让我们看一个例子:

class RouteServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->configureRateLimiting();
 
        $this->routes(function (): void {
            Route::middleware('api')
                ->group(base_path('routes/api.php'));
        });
    }
}

这类似于您在 Laravel 项目中获取的默认RouteServiceProvider。当然具体取决于项目的年限。那么我们如何扩展它?很简单,我们可以在提供者中添加额外的路由加载:

class RouteServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        $this->configureRateLimiting();
 
        $this->routes(function (): void {
            Route::middleware('api')
                ->group(base_path('routes/api.php'));
 
            Route::middleware('api')
                ->group(base_path('routes/resource/catalog.php'));
 
            Route::middleware('api')
                ->group(base_path('routes/resource/orders.php'));
 
            Route::middleware('api')
                ->group(base_path('routes/resource/payments.php'));
 
            Route::middleware('api')
                ->group(base_path('routes/resource/deliveries.php'));
        });
    }
}

这种方法的最大问题是,每次都要打开这个文件来查看哪些路由被加载。我以前维护过一个使用这种方法的一个非常大的应用程序,每次都需要花费大量的精力来不断返回来查看路由是否被加载,以及它们的顺序是否会导致问题。

第一次打开 Laravel 项目时,您会注意几个关键区域:Eloquent 模式、路由 和 测试。您打开路由文件并查看注册的路由以了解应用程序的大小以及它们是如何组合在一起的。

Requiring文件

如果你安装了 Laravel Breeze,你会注意到它在你的routes/web.php文件中添加了以下内容:

require __DIR__ . '/auth.php';

这会加载包随附的身份验证路由,使您可以将服务提供商保持在最低限度,并了解需要检查多少额外文件才能查看所有路由。让我们以上面的例子为例,并以这种方式添加路由:

// The rest of your `routes/api.php` file
 
require __DIR__ . '/resource/catalog.php';
require __DIR__ . '/resource/orders.php';
require __DIR__ . '/resource/payments.php';
require __DIR__ . '/resource/deliveries.php';

对我来说,这是对服务提供商方法的改进,因为您在浏览路由文件时可能会更好地了解您的应用程序。然而,Requiring文件是我讨厌看到的。实际上这种方式也是凌乱和懒散的。

好处是,您可以在常规的路由配置文件中看到所有路由中加载所需的内容。然而,缺点是它只是一个用于在执行此脚本时加载文件的必需凡事。

对我来说,这种方法可以改进很多。这里没有信息说明 URL 结构可能是什么样的,或者您知道的任何其他中间件正在应用于所有路由。

路由组

这是我的首选方法。我们看到它们在 中使用RouteServiceProvider,这就是我的灵感来源。这里的基本原则是,在您的主路由文件(routes/api.php在我们的例子中)中,我们构建我们的路由组,就像我们手动添加路由一样,然后告诉该组它需要使用一个单独的文件。

// The rest of your `routes/api.php` file
 
Route::prefix('catalog')->as('catalog:')->middleware(['auth:sanctum'])->group(
    base_path('routes/resources/catalog.php'),
);
 
Route::prefix('orders')->as('orders:')->middleware(['auth:sanctum'])->group(
    base_path('routes/resources/orders.php'),
);
 
Route::prefix('payments')->as('payments:')->middleware(['auth:sanctum'])->group(
    base_path('routes/resources/payments.php'),
);
 
Route::prefix('deliveries')->as('deliveries:')->middleware(['auth:sanctum'])->group(
    base_path('routes/resources/deliveries.php'),
);

从上面可以看到,我们只是使用base_path helper函数在正确的位置加载路由。查看路由文件,我们可以看到路由组正在构建您的应用程序,但它并没有接管该文件-即使您最终拥有20-30个组,它仍然非常可读。

从这里,我们可以在专用路由文件中管理“资源”和“子资源”,这意味着在导入过程中可以减少类名类,并且可以单独或在整个应用程序的内容中轻松理解专用文件。