Laravel 的路由功能很强大, 路由规则默认都定义在 routes.php 文件中,但是随着项目越来越大, 我们需要的定义的规则越来越多, 如果几百上千个路由都定义在一个文件中, 如何去维护? 如果不同的人都在同一个文件定义路由, 这就造成了冲突, 因此我们有必要将 routes.php 文件分割成多个文件, 可以按照功能模块来划分, 下面介绍一种很优雅的方式.
在 Laravel 5.1 LTS
版本 app/Providers/RouteServiceProvider.php
的 map
方法中可以如下定义:
<?php
namespace AppProviders;
use IlluminateRoutingRouter;
use IlluminateFoundationSupportProvidersRouteServiceProvider as ServiceProvider;
use Route;
class RouteServiceProvider extends ServiceProvider
{
/**
* This namespace is applied to the controller routes in your routes file.
*
* In addition, it is set as the URL generator's root namespace.
*
* @var string
*/
protected $namespace = 'AppHttpControllers';
protected $api_namespace = 'AppHttpApiControllers';
/**
* Define your route model bindings, pattern filters, etc.
*
* @param IlluminateRoutingRouter $router
* @return void
*/
public function boot(Router $router)
{
$router->pattern('id', '[0-9]+');
parent::boot($router);
}
/**
* Define the routes for the application.
*
* @param IlluminateRoutingRouter $router
* @return void
*/
public function map(Router $router)
{
$this->mapWebRoutes();
$this->mapApiRoutes();
}
/**
* Web 路由
*/
protected function mapWebRoutes()
{
Route::group([
'namespace' => $this->namespace,
'middleware' => 'restrict_web_access',
], function ($router) {
require base_path('routes/web.php');
});
}
/**
* Api 路由
*/
protected function mapApiRoutes()
{
$api_router = app('DingoApiRoutingRouter');
$api_router->group([
'version' => config('api.prefix'),
'namespace' => $this->api_namespace,
], function ($router) {
require base_path('routes/api.php');
});
}
}
文件夹结构如下:
笔者在以前的项目中,
Route
,都是以各个路由组在路由中定义,一旦一个项目浅浅庞大,路由也略显臃肿。
通过把路由规则分割写到不同的文件中, 这样一来, 就可以根据功能模块分开管理路由文件了. 此外, 你也可以简单的分割, 直接把 routes.php
中的定义拆散成多个文件, 通过 require
的方式引入.
那么这样路由分开多个文件后岂不是增加调用次数, 会不会影响性能? 答案是不必担心. 通过 Laravel 的命令:
php artisan route:cache
生成路由缓存文件后, 路由只会读取缓存文件的路由规则, 因此不会影响性能, 这样做让开发更高效和规范.