Laravel 5.6中如何从控制器向局部视图传递变量?
解决Laravel 5.6中向View Composer管理的局部视图传递激活导航项的问题
嘿,我来帮你搞定这个导航激活的问题~你之前说的把currentNavItem和其他视图变量一起传的方法确实能行,但确实有点麻烦,这里给你几个更优雅的路子:
方案1:靠路由自动判断激活项(最省心!)
其实很多时候根本不用手动传变量,我们可以直接在partials.nav视图里,通过当前访问的路由信息来自动判断哪个导航该高亮。
比如你的导航项里存了对应路由的名称,那可以这么写:
@foreach($menu as $item) <li class="{{ request()->routeIs($item->route_name) ? 'active' : '' }}"> <a href="{{ route($item->route_name) }}">{{ $item->title }}</a> </li> @endforeach
要是你习惯用URI判断,就换成request()->is($item->uri)就行:
<li class="{{ request()->is($item->uri) ? 'active' : '' }}">
这种方法一劳永逸,不用改任何控制器代码,大部分场景都适用。
方案2:控制器里共享变量给视图
如果你确实需要手动指定激活项,那可以在控制器里用View::share()把变量共享给所有视图(包括你的partials.nav):
// 控制器方法里这么写 View::share('currentNavItem', 'home'); return view('page');
不过这个方法会把变量传给所有视图,要是只有特定页面需要,那直接用view()->with()更合适,其实和你之前的思路类似,但写法更简洁:
return view('page')->with('currentNavItem', 'about');
这个变量会自动被partials.nav继承,因为局部视图是父视图的子视图,父视图的变量子视图都能拿到。
方案3:给View Composer加个动态参数
你可以修改现有的View Composer,让它能从请求里拿激活项参数,这样就不用和其他视图变量混在一起传了:
先改你的View Composer代码:
View::composer('partials.nav', function ($view) { // 从请求里取激活项 $currentNavItem = request()->get('current_nav_item'); $view->with([ 'menu' => Nav::all(), 'currentNavItem' => $currentNavItem ]); });
然后在控制器里,给请求加个属性就行:
request()->attributes->set('current_nav_item', 'contact'); return view('page');
这样就能灵活控制每个页面的激活项,还不用乱堆变量。
方案4:引入局部视图时直接传参
还有个简单的方法,就是在父视图里引入partials.nav的时候直接传变量:
@include('partials.nav', ['currentNavItem' => 'services'])
不过这个方法需要在每个用到导航的父视图里都写一遍,要是页面多的话,还是前面的方案更高效。
内容的提问来源于stack exchange,提问作者user237329
相关产品推荐
相关产品推荐

