多路由配置

默认安装的 Laravel 框架中,路由文件分为 web 和 api;如果把项目所有模块的路由都放在这两个文件中,那么路由文件就显得很臃肿,以至于后期难以维护,解决方案可以根据不同模块配置不同路由文件。
打开 \app\Providers\RouteServiceProvider.php 文件,找到 map() 方法,这个地方还特意划了两个斜杠,意思是你可以扩展自己的路由文件。

  1. public function map()
  2. {
  3. $this->mapApiRoutes();
  4. $this->mapWebRoutes();
  5. //
  6. }

新增一个 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';

注意修改伪静态文件。