【问题标题】:Load backend and frontend routes separately without interfering分别加载后端和前端路由,互不干扰
【发布时间】:2020-06-16 11:58:19
【问题描述】:

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

前端路由

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 开头.

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

提前致谢!

【问题讨论】:

  • 您可以查看正则表达式约束并尝试使用where 约束来获取所有具有"admin/*" 的路由。希望能帮助到你。 laravel.com/docs/7.x/…

标签: php laravel laravel-7


【解决方案1】:

如果你愿意,你可以对 locale 路由参数进行约束:

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

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

【讨论】:

    【解决方案2】:

    您可以在 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'));
    }
    

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

    【讨论】:

    • 这并不完全有效,但它对维护结构很好:)
    • 您是否收到任何错误消息?或者这不是您正在寻找的用例?我可以尽力帮助你
    • 不影响加载哪个视图。也许你觉得这个 repo 很有用 github.com/rappasoft/laravel-boilerplate/blob/master/routes/…
    • 那你是不是要根据路由组加载不同的ViewController,对吧?
    • 是的,我需要一些过滤器来读取 URL,例如 ->where('page', 'home');
    【解决方案3】:

    简单的方法是将两个 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');
    

    });

    【讨论】:

    • 是的,但我不想让路由以 /home 开头。谢谢你的回答
    猜你喜欢
    • 1970-01-01
    • 2021-05-05
    • 2020-11-07
    • 1970-01-01
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多