Laravel优雅的分割管理路由文件(最佳分割方式)

2017-10-16  本文已影响1024人  5e44ebcb2a17

适用于Laravel >= 5.3。

有两种方式实现路由分割,一种是扩展实现,一种是手动修改代码。推荐使用扩展,因为更为优雅且开箱即用。

第一种方式:使用扩展包

扩展包地址:
GitHub:https://github.com/ixianming/laravel-route-service-provider
国内码云:https://gitee.com/ixianming/laravel-route-service-provider

安装:

composer require ixianming/laravel-route-service-provider

使用包自动发现

不使用包自动发现

如果 Laravel 版本小于 5.5 或者不使用包自动发现:

'providers' => [
    // ...
    
    // App\Providers\RouteServiceProvider::class,
    
    Ixianming\Routing\RouteServiceProvider::class,
    
 ]

注意:

卸载扩展包后,记得在 config/app.php 中的 providers 数组里移除 Ixianming\Routing\RouteServiceProvider::class 并取消 App\Providers\RouteServiceProvider::class 的注释。

关于扩展包

扩展包继承了 Laravel 的 App\Providers\RouteServiceProvider。因此,安装扩展包后,依旧可以在 App\Providers\RouteServiceProvider 中的 boot() 方法中定义的路由模型的显式绑定、过滤器、自定义解析逻辑等。但需要注意的是,对 App\Providers\RouteServiceProvidermap()mapApiRoutes()mapWebRoutes() 这三个方法的修改是无效的,因为扩展包覆写了 map() 方法且 map() 方法中不再引用 mapApiRoutes()mapWebRoutes() 这两个方法。

扩展包功能

注:基础中间件组是指允许自动匹配路由文件的中间件组。

提醒:扩展包不会检查控制器是否重复使用。所以,同安装本扩展包前一样,如果你重复使用了控制器,那么使用 action() 方法生成的控制器的 URL 可能就不是你想要的 URL。

如何自定义配置扩展包,以及更为详细的介绍请前往扩展包地址查看,就不在这里赘述了。

扩展包地址:
GitHub:https://github.com/ixianming/laravel-route-service-provider
国内码云:https://gitee.com/ixianming/laravel-route-service-provider

第二种方式:手动修改代码

在Laravel 5.6/5.5/5.4/5.3版本中,路由文件默认放在了 routes 目录下。

在官方的定义里,http路由有 2 个文件

(关于路由的更多解释请自行参见Laravel文档的路由部分)

无论是使用web中间件的路由还是api中间件的路由,随着项目越来越大,需要的定义的路由越来越多,如果几百上千个路由都定义在一个文件中,我相信将很难进行维护和管理。

因此,为了更方便的管理路由,我们需要对路由进行分割,模块化管理。

接下来我们细细道来:

app/Providers/RouteServiceProvider.php 这个文件负责处理 routes 目录下的所有 http 路由。

源代码片段:

public function map()
{
    $this->mapApiRoutes();

    $this->mapWebRoutes();

    //
}

protected function mapWebRoutes()
{
    Route::middleware('web')
         ->namespace($this->namespace)
         ->group(base_path('routes/web.php'));
}

protected function mapApiRoutes()
{
    Route::prefix('api')
         ->middleware('api')
         ->namespace($this->namespace)
         ->group(base_path('routes/api.php'));
}

从代码中可以看出,map() 方法是实际搜集全部路由的方法,为了代码职责/结构更加清晰,从而定义了 mapApiRoutes()mapApiRoutes() 两个具体的方法,并在 map() 中引用。

换句话说,可以在 app/Providers/RouteServiceProvider.php 文件中新增方法去定义自己的路由!

public function map()
{
    $this->mapApiRoutes();
    $this->mapWebRoutes();

    $this->myRoutes();//自定义路由方法
}

protected function myRoutes()//自定义路由方法
{
    Route::prefix('xxx')//前缀
         ->middleware('xxx')//中间件
         ->namespace($this->namespace)
         ->group('path');//path为自定义路由文件绝对路径
}

......

可以料想到,如果路由文件很多的话,就得定义很多很多方法了,那上面这个方法就显得相当臃肿了! (╯﹏╰)

下面介绍一种优雅的方式~

我们需要对 app/Providers/RouteServiceProvider.php 这个文件动一下手脚。

最后的最后~ 在生产环境上。通过 Laravel 的命令:

php artisan route:cache

上面这个命令会生成 bootstrap/cache/routes.php 文件。

需要注意的是,路由缓存并不会作用在基于闭包的路由。要使用路由缓存,必须将所有闭包路由转换为控制器类。

使用闭包路由,在生成缓存时,将报错!

生成路由缓存文件后,路由就只会读取缓存文件的路由规则啦!不必担心引用多个文件带来的IO性能影响等等。

另外如果添加了任何新的路由,都必须生成新的路由缓存噢!

如果想要移除缓存路由文件的话,可以使用命令:

php artisan route:clear
上一篇下一篇

猜你喜欢

热点阅读