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

如何向Laravel路由组传递分类数据?(React+Inertia环境)

问题:Laravel+Inertia中为指定路由组传递分类数据

我用最新版Laravel、React和Inertia开发网站,网站头部需要展示通过Eloquent查询获取的分类数据。想把分类数组传递给一组路由,只让这组路由对应的页面能渲染对应的头部。刚接触Laravel,不确定用Controller还是Middleware实现,也知道Inertia的共享数据功能,但希望仅作用于指定路由组。尝试创建中间件并在web.php中使用,但没成功。

我的尝试代码

CategoryMiddleware.php

class CategoryMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
     */
    public function handle(Request $request, Closure $next): Response
    {
        $categories = Category::with('children.children')->whereNull('parent_id')->get();
        view()->share('categories', $categories);
        return $next($request);
    }
}

web.php

Route::middleware(['category'])->group(function () {
    Route::get('/', function () {
        return Inertia::render('Shop/Home');
    })->name('home');
});

Kernel.php

protected $middlewareAliases = [
    .
    .
    .
    'category' => \App\Http\Middleware\CategoryMiddleware::class,
];

正确实现方式

你用view()->share()是错的,因为Inertia不直接使用Laravel的视图共享数据机制,得用Inertia的局部共享方法才能给指定路由组传递数据。

修改中间件代码

把中间件里的view()->share()替换成Inertia的share()方法:

use Inertia\Inertia;

class CategoryMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        $categories = Category::with('children.children')->whereNull('parent_id')->get();
        
        // 用Inertia的share方法共享数据
        Inertia::share('categories', $categories);
        
        return $next($request);
    }
}

逻辑说明

这个中间件只会在你指定的路由组内生效,只有进入该组路由的请求才会带上categories数据,其他路由不会获取到这个数据,完全符合你的需求。

前端获取数据

在React组件中,直接通过usePage()钩子就能拿到共享的分类数据:

import { usePage } from '@inertiajs/react';

function Header() {
    const { categories } = usePage().props;
    
    return (
        <nav>
            {categories.map(category => (
                {/* 这里写你的分类渲染逻辑 */}
            ))}
        </nav>
    );
}

其他可选方案(不用中间件)

如果不想用中间件,也可以给路由组对应的控制器添加构造方法,在构造里实现数据共享:

class ShopController extends Controller
{
    public function __construct()
    {
        $this->middleware(function ($request, $next) {
            $categories = Category::with('children.children')->whereNull('parent_id')->get();
            Inertia::share('categories', $categories);
            return $next($request);
        });
    }
    
    public function home()
    {
        return Inertia::render('Shop/Home');
    }
}

对应的路由配置改成:

Route::controller(ShopController::class)->group(function () {
    Route::get('/', 'home')->name('home');
});

内容的提问来源于stack exchange,提问作者Mahdi Nateghi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 00:45:04