多路由配置
默认安装的 Laravel 框架中,路由文件分为 web 和 api;如果把项目所有模块的路由都放在这两个文件中,那么路由文件就显得很臃肿,以至于后期难以维护,解决方案可以根据不同模块配置不同路由文件。
打开 \app\Providers\RouteServiceProvider.php 文件,找到 map() 方法,这个地方还特意划了两个斜杠,意思是你可以扩展自己的路由文件。
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
//
}
新增一个 admin 路由:
public function map()
{
$this->mapApiRoutes();
$this->mapWebRoutes();
$this->mapAdminRoutes();
}
新增 mapAdminRoutes 方法:
protected function mapAdminRoutes()
{
Route::prefix('admin') // 后缀,demo.com/admin
->middleware('web')
->namespace($this->namespace . '\Admin') // 命名空间
->group(base_path('routes/admin.php')); // 路由文件
}
这里有两个地方需要注意:
1,注意 ->middleware(‘web’),这里面的 web 其实对应着 \App\Http\Kernel 中的路由中间件分组 web (可查看 \app\Http\Kernel.php 文件中的 middlewareGroups 数组),同时也会把对应的路由转发到 routes/web.php 中;如果不添加 ->middleware(‘web’) ,很明显的问题如:admin 中模板使用 csrf_field() ,渲染后 _token 的 value 为空。当然,你也可以在 $middlewareGroups 数组中自定义 admin 分组。
// app\Http\Kernel.php中的middlewareGroups数组
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
];
2,注意 ->namespace($this->namespace . ‘\Admin’) 。默认的 api、web 中并没有 .\Api 或者 .\Web 这样的配置,添加 .{命名空间名字} 可省去路由配置指定命名空间的作用。我们通过下面示例来对比说明:
// ->namespace($this->namespace)
// routes/admin.php
Route::match(['get', 'post'], 'demo/demo', 'Admin\DemoController@demo');
// ->namespace($this->namespace . '\Admin')
// routes/admin.php
Route::match(['get', 'post'], 'demon/demo', 'DemoController@demo');
设置完成后,在 /routes 文件夹下创建 admin.php 文件,即可添加 admin 模块下的路由规则。
版本差异
8.x
https://learnku.com/docs/laravel/8.x/releases/9351#d99737
恢复 Laravel 7.x 那种控制器的路由前缀,可以简单地将 $namespace 属性添加到应用程序的 app/Providers/RouteServiceProvider 中。
// 代码注释打开
protected $namespace = 'App\\Http\\Controllers';
注意修改伪静态文件。