Laravel 5.6:为路由资源设共享名称,实现菜单激活类自动匹配
解决Laravel后台菜单激活状态匹配所有资源路由的问题
嘿,这个问题其实很好解决!你现在的代码只匹配了单个路由名称,但Laravel的Route::resource会自动生成一系列带前缀的路由名称(比如posts.index、posts.create、posts.edit这些),所以我们只需要判断当前路由名称是否以posts.开头,或者直接检查当前请求是否由目标控制器处理就行。下面给你两种实用的方案:
方案一:通过路由名称前缀判断
这种方法依赖Laravel自动生成的资源路由命名规则,所有posts相关的路由名称都会以posts.开头,我们可以用字符串前缀匹配来判断:
代码修改(sidebar.blade.php)
<li class="nav-item"> <a class="nav-link {{ str_starts_with(Route::current()->getName(), 'posts.') ? 'active' : '' }}" href="/admin/posts">Posts</a> </li>
这里用到了Laravel的辅助函数str_starts_with(),它会检查当前路由名称是否以posts.开头,如果是就添加active类。
如果你习惯用门面类,也可以这样写(需要确保引入了Illuminate\Support\Str):
@use Illuminate\Support\Str; <li class="nav-item"> <a class="nav-link {{ Str::startsWith(Route::current()->getName(), 'posts.') ? 'active' : '' }}" href="/admin/posts">Posts</a> </li>
方案二:通过控制器类判断
如果你不想依赖路由名称,也可以直接检查当前请求是否由Admin\PostController处理,这样不管路由名称怎么改,只要是这个控制器的操作,菜单都会激活:
代码修改(sidebar.blade.php)
<li class="nav-item"> <a class="nav-link {{ Route::current()->getController() instanceof \App\Http\Controllers\Admin\PostController ? 'active' : '' }}" href="/admin/posts">Posts</a> </li>
这种方法更灵活,适合后续可能修改路由命名的场景。
额外提示
如果你的Laravel版本比较旧(低于8.0),str_starts_with()可能不存在,这时可以用substr()来替代:
{{ substr(Route::current()->getName(), 0, 6) === 'posts.' ? 'active' : '' }}
内容的提问来源于stack exchange,提问作者mchev
相关产品推荐
相关产品推荐

