后端和前端路由分开加载,互不干扰

Load backend and frontend routes separately without interfering

我有两种路由,管理路由和前端路由。

前端路由

Route::get('{locale?}/', ['uses' => '\App\Http\Controllers\loadViewController@home']);
Route::get('{locale?}/{page}', ['uses' => '\App\Http\Controllers\loadViewController@index']);
Route::get('{locale?}/{template?}/{page}', ['uses' => '\App\Http\Controllers\loadViewController@detail']);

后端路由

Route::prefix('admin/dashboard')->group(function () {
  Route::get('/', 'DashboardController@index')->name('dashboard'); 
});

现在,当我键入 admin/dashboard 或 api/admin 时,laravel 使用前端路由加载视图,而我希望加载后端视图。

为了过滤掉后端路由,我尝试了这个

Route::group(['where' => ['page' => '^(?!admin|api)$', 'template' => '^(?!admin|api)$']], function ({
  Route::get('{locale?}/', ['uses' => '\App\Http\Controllers\loadViewController@home']);
  Route::get('{locale?}/{page}', ['uses' => '\App\Http\Controllers\loadViewController@index']);
  Route::get('{locale?}/{template?}/{page}', ['uses' => '\App\Http\Controllers\loadViewController@detail']); 
});

这显然不起作用

前端路由也不应该有类似/website的东西,它们都应该以/

开头

我的问题是:如何在不干扰调用时分别加载后端和前端路由,即使它们在参数方面具有相同的 url 长度,请记住管理路由始终启动使用 /admin 或 /api.

注意:我不能将后端路由放在前端路由之前

提前致谢!

简单的方法是将两个 url 分组为单独的组。例子如下:

Route::group(['prefix' => 'admin', 'as' => 'admin'], function () {
Route::post('/dashboard', 'AdminController@dashboard');

});

Route::group(['prefix' => 'home', 'as' => 'home'], function () {
Route::get('/record/{id}', 'HomeController@getRecord');

});

如果您愿意,可以对 locale 路由参数施加约束:

Route::pattern('locale', '^(?!(api|admin)$)(\w*)');

您可以将它放在 RouteServiceProviderboot 方法中,它现在将不允许 locale 路由参数匹配 'api''admin'.

您可以在 RouteServiceProvider 中注册单独的路由。以下是您的操作方法。

里面 RouteServiceProvider.php 做:

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

    $this->mapAdminRoutes();
}

mapFrontendRoutes() 的定义:

protected function mapFrontendRoutes()
{
     Route::prefix('{locales?}')
         ->middleware('frontend')
         ->namespace($this->namespace.'\Frontend')
         ->group(base_path('routes/frontend.php'));
}

mapAdminRoutes() 的定义:

protected function mapAdminRoutes()
{
     Route::prefix('admin')
         ->middleware('admin')
         ->namespace($this->namespace.'\Admin')
         ->group(base_path('routes/admin.php'));
}

我个人觉得这非常有用,有助于声明无干扰且合乎逻辑的路线。欢迎反馈。