Laravel同控制器绑定两组资源路由route()跳转与active匹配异常问题
问题原因与修复方案
一、第一种写法遗漏的配置
你之前的写法存在两个核心问题:
- Laravel 资源路由会默认根据URI自动生成路由名前缀,URI 为
user/posts的资源路由默认生成的路由名格式为user.posts.{操作名}(比如列表页是user.posts.index,详情页是user.posts.show),你之前仅用->name('show', 'user.posts')单独覆盖了详情页的路由名,没有为整个资源路由统一配置名称规则,也不存在名为posts的全局路由。 - 同一路由组内重复定义相同控制器的资源路由时,后面定义的管理员端路由会覆盖部分前置路由的默认命名,这才导致管理员场景下能偶然跳转到正确地址,普通用户场景下匹配不到对应路由。
正确的路由定义应该用names方法为整个资源路由指定统一名称前缀:
Route::group(['middleware' => 'auth'], function () { Route::resource('user/posts', PostController::class)->names('user.posts'); Route::resource('admin/posts', PostController::class)->middleware('is_admin')->names('admin.posts'); });
修改后两个资源路由的所有操作都会生成符合预期的路由名:普通用户端列表路由为user.posts.index,管理员端列表路由为admin.posts.index。
二、导航激活状态修复
你之前routeIs('posts')的匹配规则不存在对应路由,自然无法激活。要匹配两端所有posts相关路由,直接用通配符匹配路由名前缀即可:
<x-jet-nav-link href="{{ route(auth()->user()->isAdmin() ? 'admin.posts.index' : 'user.posts.index') }}" :active="request()->routeIs(['admin.posts.*', 'user.posts.*'])"> {{ __('Posts') }} </x-jet-nav-link>
如果你只需要在列表页激活,也可以把匹配规则改成['admin.posts.index', 'user.posts.index']。
内容的提问来源于stack exchange,提问作者Jongha Lim
相关产品推荐
相关产品推荐

