laravel5.5 視圖共享數據

視圖間共享數據

  • 視圖門面 share() 方法
  • 視圖門面 composer() 方法
tips:都是使用 View 門面來訪問 Illuminate\Contracts\View\Factory 的底層實現

視圖share()

有時須要在全部視圖之間共享數據片斷,這時候能夠使用視圖門面的 share 方法。php

1,通常狀況下,我會在app\http\Controllers\xx下建立一個基礎控制器 BaseController.phpjson

<?php
namespace App\Http\Controllers\ExtMan;

use Illuminate\Routing\Controller;

class BaseController extends Controller
{
    public function __construct(\Auth $auth)
    {
        $this->initViewShare();    //視圖共享數據
    }
    /**
     *  視圖共享數據方法
     */
    public function initViewShare()
    {
        view()->share('action_name',get_action_name()); //當前URL的方法器名
     }
}


//視圖使用 
//共享視圖通常都是在layout中
{{ $action_name }}
get_action_name() 是自定義的一個函數。

tips:
建立 app\Helpers\ExtmanFun.phpcomposer.jsonautoload引入數組

"files":[
     "app/Helpers/ExtmanFun.php"
 ]
運行 composer dump-autoload 會自動加載

2,在 AppServiceProvider 服務提供器(或者新建提供器) 的boot方法中調用share()app

<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
    /**
     * 啓動全部應用服務
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
        //也可以使用
        view()->share('name','共享數據片斷');
    }
}

視圖composer()

視圖合成器是當視圖被渲染時的 回調函數類方法 ,若是你每次渲染視圖時都要綁定視圖的數據,好比用戶登錄信息。能夠使用composer() 將邏輯組織到一個單獨的地方。
本例中,咱們將在AppServiceProvider服務提供器中註冊視圖合成器,
提供器代碼以下:composer

<?php
namespace App\Providers;

#use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // 使用基於類方法
        // 第一個參數能夠指定共享給那個視圖,多個視圖用數組,共享到所有視圖能夠用 *
        // 或者某個目錄下全部視圖 
        view()->composer(
            //'*', 'App\Http\ViewComposers\AuthComposer'
            //['extman.home, welcome'], 'App\Http\ViewComposers\AuthComposer'
            ['extman.*'], 'App\Http\ViewComposers\AuthComposer'
        );

        //使用基於回調函數
        view()->composer('*',function($view){
            $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg'));
        });
    }
other code
}
若是建立一個新的服務提供器來包含視圖composer 註冊,須要添加該服務提供者到配置文件 config/app.php 的 providers 數組中

到此已經註冊了視圖合成器,每次渲染 extman目錄下全部視圖時都會執行 AuthComposer@compose 方法。
定義視圖合成器類 App\Http\ViewComposers\AuthComposer.phpide

<?php
namespace App\Http\ViewComposers;

use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;

class AuthComposer
{
    protected $users;

    public function __construct(UserRepository $users)
    {
        // 依賴注入經過服務容器自動解析...
        $this->users = $users;
    }

    //綁定數據到視圖
    public function compose(View $view)
    {
        $user_info = \Auth::user();
        $view->with('motto', $user_info);
        $view->with('count', $this->users->count());
    }
}

視圖被渲染前,AuthComposer類的 compose 方法被調用,同時 Illuminate\View\View 實例被注入該方法,從而能夠使用其 with 方法來綁定數據到視圖。函數

全部的視圖合成器都會經過 服務容器 進行解析,因此你能夠在視圖合成器的構造函數中類型提示須要注入的依賴項。
相關文章
相關標籤/搜索