我们的视图有很多公共部分,比如导航菜单、底部信息、用户信息等,通常我们会以单独的视图组件来处理这些元素区块,但是如何从后端传递这些组件需要的数据变量是个问题,因为这些组件在多个页面中共用,从后端角度来看,会涉及到多个路由/控制器方法,难道我们要每次都重复获取并传递这些数据吗?有没有一种方式可以支持一处定义,多处复用?

1.使用laravel的view()->share方法

通过视图对象提供的 share 方法,我们可以在某个服务提供者如 AppServiceProvider 的 boot 方法中定义共享的视图变量:

public function boot()
{
    Schema::defaultStringLength(191);

    $weekItems = ['日', '一', '二', '三', '四', '五', '六'];
    $today = sprintf('星期%s', $weekItems[date("w", time())]);
    view()->share('today', $today);
}

如果不指定视图组件的话,上述代码的含义是在所有视图中共享today变量,这当然是有点浪费了,不推荐这么做,我们通常会以闭包方式通过 View Composer 指定视图作用域来预设共享「变量」。

2.使用laravel的view()->composer方法

view()->composer(['layouts.app'], function ($view) {
    $view->with('publicMsg', '指定视图组件共用信息');
});

前端小菜
266 声望8 粉丝

努力可以改变能力