You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在单个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路由:

  1. 创建后台路由中间件:
// 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);
    }
}
  1. 在app/Http/Kernel.php中注册中间件:
protected $routeMiddleware = [
    // 其他中间件...
    'set-admin-ziggy' => \App\Http\Middleware\SetAdminZiggyRoutes::class,
];
  1. 给后台路由组应用中间件:
Route::domain('admin.yourdomain.com')->middleware(['auth', 'set-admin-ziggy'])->name('admin.')->group(function () {
    // 后台路由...
});

同理可创建前端对应的中间件,进一步拆分逻辑。

效果验证

访问前端域名时,window.ziggy仅包含frontend.*前缀的路由;访问后台域名时仅包含admin.*前缀的路由,既避免了后台路由泄露,也减少了每次请求的传输数据量。

内容的提问来源于stack exchange,提问作者Michael Sørensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 14:02:08