天天看點

Laravel 5 多個視圖共享資料的方法

我們都知道模闆一般會用到繼承,導航欄就是一個很好的例子,但是導航欄的資料如何共享,比如有個導航的檔案叫在view/navigation.blade.php

為了簡單一點,檔案裡隻有設定了一個變量

1

{{ $cqh }}

現在的要求是每個頁面都會用到這個變量,如何共享這個資料呢?

一般這樣的操作我會在laravel服務的boot方法裡設定,下面介紹兩種共享資料的方法

方法一:使用view:share方法,如cqhserviceprovider裡

2

3

4

public function boot()

{

    view::share('cqh','chenqionghe');

}

這是使用外觀模式,也可以直接使用view()方法,

view()->share('cqh', 'chenqionghe');

方法二:使用composer方法單獨對這個navigation.blade.php進行傳送資料,方法如下

5

6

    view()->composer('navigation', function ($view) {

        $view->with('cqh','chenqionghe');

    });

以上是使用閉包的形式來完成這個操作,其實這和路由一樣,也可以用類來代替,laravel裡叫元件,方法如下

    view::composer('navigation', 'app\http\viewcomposers\myviewcomposer');

上面這樣就是注冊了視圖元件,并且在每次 navigation視圖渲染的時候,myviewcomposer@compose 都将會被執行。

下面我們來看這個元件怎麼定義

7

8

9

<?php namespace app\http\viewcomposers;

use illuminate\contracts\view\view;

class myviewcomposer

    public function compose(view $view)

    {

    }

在視圖被渲染之前,視圖元件的 compose 方法就會被調用,并且傳入一個 illuminate\contracts\view\view 執行個體。你可以使用 with 方法來把資料綁定到 view。

注意:方法一和方法二其實是有差別的,方法一是對所有的視圖都傳遞的cqh資料,而方法二隻是對navigation視圖傳遞了cqh資料

如果方法二要達到方法一的效果,可以這樣

view::composer('*', function($view)

    //

});

這樣就會對所有視圖進行傳遞了

也可以針對多個視圖指定myviewcomposer元件

view::composer(['navigation', 'footer'], 'app\http\viewcomposers\myviewcomposer');

也可以使用 composers 方法來同時定義一群視圖元件

view::composers([

    'app\http\viewcomposers\admincomposer' => ['admin.index', 'admin.profile'],

    'app\http\viewcomposers\usercomposer' => 'user',

    'app\http\viewcomposers\productcomposer' => 'product'

]);

本文作者:佚名

來源:51cto