后端和前端路由分开加载,互不干扰
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*)');
您可以将它放在 RouteServiceProvider
的 boot
方法中,它现在将不允许 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'));
}
我个人觉得这非常有用,有助于声明无干扰且合乎逻辑的路线。欢迎反馈。
我有两种路由,管理路由和前端路由。
前端路由
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*)');
您可以将它放在 RouteServiceProvider
的 boot
方法中,它现在将不允许 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'));
}
我个人觉得这非常有用,有助于声明无干扰且合乎逻辑的路线。欢迎反馈。