PHP Laravel NGINX html css Bootstrap Python Symfony Apache Windows linux jquery Django ASP vanilla Slim vagrant docker Homestead MySQL Redis Git SVN ssh Root vim PhpStorm Pycharm sass less PHP Laravel android html css Vue Angular React NGINX html css Javascript

Laravel 5.3+ 如何将变量传递给View及如何共享变量给多个Views

原创

原创不易 ~ 转载请注明出处哦

注意:本文适用于Laravel版本5.3及更高。

Laravel中,我们通过MVC模式,在控制器中处理好了数据,然后就是将数据传递给指定的View

通常给View传递数据有两种方式,我们先来看第一种:

public function index()  
{  
    ... //logic to get required variables   
   
    return view('index', [  
        'visits' => $visits,  
        'page_views' => $page_views,  
    ]);  
}

我们看到,在控制器的方法index中,我们指定了生成的View的文件名为index,后面紧接着一个数组,其中含有了我们需要传递给index这个View的变量。

那么我们在View中,就可以直接使用这两个变量了:

    <h1>Total visits: {{ $visits }}</h1>  
    <h2>Total page views: {{ $page_views }}</h2>

现在我们看一下第二种传递数据的方法,使用with这个函数:

public function index()  
{  
    ... //logic to get required variables   
   
    return view('index')->with('visits', $visits);  
}

这种方法可以用来传递单个变量,也可以传递数组,非常灵活。


那么问题来了,如果我们想将一部分数据共享给多个View,而我们又不想重复地使用上面的方法,在每个控制器方法中添加上传递变量的代码,那么我们该怎么做呢?

答案就是View Composer
简单一点来说,View Composer就是在View被渲染的时候会先被调用的函数,我们可以利用它来将变量共享给多个Views

首先我们在app/Providers文件夹下找到AppServiceProvider.php,然后我们打开这个文件,在其boot方法中添加上以下代码:

    /**  
     * Bootstrap any application services.  
     * @return void  
     */  
    public function boot()  
    {  
        View::composer(['backend.*', 'frontend.index'], function ($view) {  
            ... //logic to get required variables   
  
            $view->with('visits', $visits);  
        });  
    }

可以看到,我们将$visits分享给了多个Views。注意,这里数组中我们可以指定多个Views,并且可以使用Wildcard,即*来囊括某个文件夹下的所有Views。这样一来,我们就可以在所有指定的View中,使用共享的变量了:

    <p>I'm shared across multiple views! - {{ $visits }}</p>

当然,我们也可以选择不在AppServiceProvider中分享我们的变量,而新建一个ComposerServiceProvider来完成这个任务,但是要注意的是,建立了新的ServiceProvider后,需要在config/app.php中的providers数组中将其注册。具体请参考Laravel官方文档:

https://laravel.com/docs/5.6/views#view-composers


正在加载验证码......
请先完成验证