如何为Laravel Voyager配置两个不同的后台管理URL?
如何给Laravel Voyager配置两个独立的后台管理URL
直接重复调用Voyager::routes()确实会出现重定向冲突的问题——因为Voyager内部的路由名称、重定向逻辑、菜单链接都是默认绑定到admin前缀的,两次注册会导致路由名称重复,系统分不清该用哪个前缀跳转。下面是亲测有效的解决方案:
步骤1:复制并修改Voyager路由文件
Voyager的默认路由在vendor/tcg/voyager/routes/voyager.php,我们需要复制两份出来,分别适配两个后台前缀:
- 在项目根目录的
routes文件夹下创建voyager-admin1.php和voyager-admin2.php - 把原路由文件内容分别粘贴到这两个文件里,然后做两处修改:
- 把路由组的
prefix分别改成'admin-1'和'admin-2' - 把所有路由的
name前缀替换成admin1.和admin2.(比如原route('admin.dashboard')改成route('admin1.dashboard'))
- 把路由组的
步骤2:加载自定义路由
在routes/web.php里替换原来的Voyager::routes()调用,改成加载我们的自定义路由:
require base_path('routes/voyager-admin1.php'); require base_path('routes/voyager-admin2.php');
步骤3:自定义登录控制器,修复重定向逻辑
Voyager默认登录后会跳转到admin.dashboard路由,我们需要给两个后台分别定制登录控制器:
- 在
app/Http/Controllers/Voyager下创建Admin1LoginController.php:
<?php namespace App\Http\Controllers\Voyager; use TCG\Voyager\Http\Controllers\VoyagerLoginController as BaseLoginController; class Admin1LoginController extends BaseLoginController { protected function redirectPath() { // 登录后跳转到admin1的仪表盘 return route('admin1.dashboard'); } }
- 同样创建
Admin2LoginController.php,把redirectPath里的路由改成admin2.dashboard - 回到对应的路由文件,把登录路由指向自定义控制器:
- 比如在
voyager-admin1.php里,把原登录路由替换成:Route::get('login', [\App\Http\Controllers\Voyager\Admin1LoginController::class, 'showLoginForm'])->name('admin1.login'); Route::post('login', [\App\Http\Controllers\Voyager\Admin1LoginController::class, 'login'])->name('admin1.login.post'); - admin2的路由文件做同样修改,指向
Admin2LoginController
- 比如在
步骤4:调整菜单链接
Voyager后台的菜单默认使用admin前缀的路由,需要手动修改菜单链接:
- 登录任意一个后台,进入「菜单管理」
- 把每个菜单项的链接改成对应后台的路由(比如admin1的仪表盘链接填
{{ route('admin1.dashboard') }},或者直接写/admin-1/dashboard)
可选:分离后台用户权限(如果需要)
如果希望不同用户只能访问对应后台,可以修改Voyager的admin中间件:
- 创建自定义中间件
CheckAdmin1Access和CheckAdmin2Access - 在中间件里检查当前用户是否属于指定的管理员组(比如给用户加
admin_type字段,区分admin1/admin2) - 在对应的路由组里替换默认的
admin中间件为自定义中间件
这样配置完成后,/admin-1和/admin-2就能独立工作,不会再出现互相重定向的问题啦。
内容的提问来源于stack exchange,提问作者Ganesha Ampuh
相关产品推荐
相关产品推荐

