如何向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
相关产品推荐
相关产品推荐

