在单个Laravel应用中部署双独立Inertia.js应用并拆分Ziggy路由
在单Laravel应用中拆分Inertia.js的Ziggy路由
要解决单Laravel应用中前后台Inertia路由数据混同的问题,核心思路是根据请求域名动态过滤Ziggy输出的路由集合,以下是具体实现方案:
1. 给路由按域名与前缀分组
先在routes/web.php中给前后台路由分别设置域名约束和名称前缀,确保路由分组清晰:
// 前端展示区路由 Route::domain('frontend.yourdomain.com')->name('frontend.')->group(function () { Route::get('/', [FrontendController::class, 'home'])->name('home'); // 其他前端业务路由... }); // 后台管理区路由 Route::domain('admin.yourdomain.com')->name('admin.')->middleware('auth')->group(function () { Route::get('/', [AdminController::class, 'dashboard'])->name('dashboard'); // 其他后台业务路由... });
2. 动态生成对应分组的Ziggy路由
通过Inertia共享数据的方式,根据当前请求域名筛选路由,替代默认的@routes指令逻辑:
在App\Providers\AppServiceProvider.php的boot方法中添加:
use Illuminate\Http\Request; use Tighten\Ziggy\Ziggy; use Inertia\Inertia; public function boot() { Inertia::share(function (Request $request) { // 判断当前请求所属的应用分区 $isAdminDomain = $request->getHost() === 'admin.yourdomain.com'; // 生成对应分组的路由集合 $ziggyRoutes = new Ziggy([ 'only' => $isAdminDomain ? ['admin.*'] : ['frontend.*'], ]); return [ 'ziggy' => $ziggyRoutes->toArray(), ]; }); }
3. 前端注入Ziggy数据
在Inertia的根模板(如resources/views/app.blade.php)中,手动注入后端传递的Ziggy数据,替换默认的@routes指令:
<script> window.ziggy = {{ json_encode($ziggy) }}; </script>
4. 可选:用中间件细化路由过滤逻辑
如果需要更灵活的路由控制,可以创建专属中间件来处理不同分区的Ziggy路由:
- 创建后台路由中间件:
// app/Http/Middleware/SetAdminZiggyRoutes.php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Tighten\Ziggy\Ziggy; class SetAdminZiggyRoutes { public function handle(Request $request, Closure $next) { app()->instance('ziggy', new Ziggy(['only' => ['admin.*']])); return $next($request); } }
- 在
app/Http/Kernel.php中注册中间件:
protected $routeMiddleware = [ // 其他中间件... 'set-admin-ziggy' => \App\Http\Middleware\SetAdminZiggyRoutes::class, ];
- 给后台路由组应用中间件:
Route::domain('admin.yourdomain.com')->middleware(['auth', 'set-admin-ziggy'])->name('admin.')->group(function () { // 后台路由... });
同理可创建前端对应的中间件,进一步拆分逻辑。
效果验证
访问前端域名时,window.ziggy仅包含frontend.*前缀的路由;访问后台域名时仅包含admin.*前缀的路由,既避免了后台路由泄露,也减少了每次请求的传输数据量。
内容的提问来源于stack exchange,提问作者Michael Sørensen
相关产品推荐
相关产品推荐

