原文链接:https://www.whongbin.cn/article-detail/151.html
前言
在laravel中有两种可以把变量应用到视图的方式,在这做个记录,方便之后使用.
视图共享数据
1.所有视图共享数据 view()->share()
当所有视图都需要同一个数据时,使用视图工厂的
share
方法。
全局帮助函数view
,如果传入参数,则返回Illuminate\View\View
实例,不传入参数则返回Illuminate\View\Factory
实例。所以我们可以通过在服务提供者(app\Providers\AppServiceProvider.php
)的boot
方法中(也可以自建服务进行使用,一般会用于菜单的管理)使用如下方式实现视图间共享数据:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$verticalMenuJson = file_get_contents(public_path('menus/vertical-menu.json'));
$menuData = json_decode($verticalMenuJson);
view()->share('menuData',$menuData);
// \View()::share('menuData',$menuData);
}
2.指定视图共享数据 view()->composer()
当所有视图都需要同一个数据时,使用视图工厂的
share
方法。
全局帮助函数view
,如果传入参数,则返回Illuminate\View\View
实例,不传入参数则返回Illuminate\View\Factory
实例。所以我们可以通过在服务提供者(app\Providers\AppServiceProvider.php
)的boot
方法中(也可以自建服务进行使用,一般会用于菜单的管理)使用如下方式实现视图间共享数据:
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Schema::defaultStringLength(191);
view()->composer('admin.layout',function($view){
$menuData = \App\Models\Permission::with(['childs'])->where('parent_id',0)->orderBy('sort','desc')->get();
$view->with('menuData',$menuData);
});
}
1.指定一个视图使用加载变量:
view()->composer('admin.layout'],function($view){
$menuData = \App\Models\Permission::with(['childs'])->where('parent_id',0)->orderBy('sort','desc')->get();
$view->with('menuData',$menuData);
});
2.指定多个视图使用加载变量:
view()->composer(['admin.layout1','admin.layout2'],function($view){
$menuData = \App\Models\Permission::with(['childs'])->where('parent_id',0)->orderBy('sort','desc')->get();
$view->with('menuData',$menuData);
});
3.指定所有视图使用加载变量:
view()->composer('*',function($view){
$menuData = \App\Models\Permission::with(['childs'])->where('parent_id',0)->orderBy('sort','desc')->get();
$view->with('menuData',$menuData);
});
使用方式
在视图文件中直接使用输出变量的方式使用就可以了
{{$menuData}}
{{-- 一个实例: --}}
<ul class="nav navbar-nav">
@if(!empty($menuData) && isset($menuData))
@foreach ($menuData->menu as $menu)
<li class="@if(isset($menu->submenu)){{'dropdown'}} @endif nav-item" data-menu="dropdown">
<a class="@if(isset($menu->submenu)){{'dropdown-toggle'}} @endif nav-link" href="{{asset($menu->url)}}"
@if(isset($menu->submenu)){{'data-toggle=dropdown'}} @endif
@if(isset($menu->newTab)){{"target=_blank"}}@endif>
<i class="menu-livicon" data-icon="{{$menu->icon}}"></i>
<span>{{ __('locale.'.$menu->name)}}</span>
</a>
</li>
@endforeach
@endif
</ul>