首頁 > php框架 > Laravel > 主體

laravel5.5框架中視圖間如何共享資料?視圖間共享資料的兩種方法(附程式碼)

不言
發布: 2018-08-02 14:11:39
原創
3367 人瀏覽過

laravel框架中視圖間共享資料有兩種,一種是用視圖門面share()方法實現,另一種是用視圖門面composer() 方法實現,那麼,兩種方法的實現究竟是怎麼樣的呢?讓我們來看看接下來的文章內容。

首先,需要注意的一點是:都是使用View 門面來存取Illuminate\Contracts\View\Factory 的底層實作

視圖門面share()方法

有時需要在所有視圖之間共用資料片段,這時候可以使用視圖門面的share 方法。

1,一般情況下,我會在app\http\Controllers\xx下建立一個基礎控制器 BaseController.php,

<?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.php ,composer.json的autoload 引入

 "files":[
     "app/Helpers/ExtmanFun.php"
 ]
登入後複製

執行composer dump-autoload 會自動載入

2,在AppServiceProvider 服務提供者(或新建提供者) 的boot方法中呼叫share()

<?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
    /**
     * 启动所有应用服务
     *
     * @return void
     */
    public function boot()
    {
        View::share(&#39;key&#39;, &#39;value&#39;);
        //也可使用
        view()->share(&#39;name&#39;,&#39;共享数据片段&#39;);
    }
}
登入後複製

檢視門面composer()方法

視圖合成器是當視圖被渲染時的回呼函數或類別方法,如果你每次渲染視圖時都要綁定視圖的數據,例如使用者登陸資訊。可以使用composer() 將邏輯組織到一個單獨的地方。
本例中,我們將在AppServiceProvider服務提供者中註冊視圖合成器,
提供者程式碼如下:

<?php
namespace App\Providers;

#use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        // 使用基于类方法
        // 第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 *
        // 或者某个目录下所有视图 
        view()->composer(
            //&#39;*&#39;, &#39;App\Http\ViewComposers\AuthComposer&#39;
            //[&#39;extman.home, welcome&#39;], &#39;App\Http\ViewComposers\AuthComposer&#39;
            [&#39;extman.*&#39;], &#39;App\Http\ViewComposers\AuthComposer&#39;
        );

        //使用基于回调函数
        view()->composer(&#39;*&#39;,function($view){
            $view->with(&#39;user&#39;,array(&#39;name&#39;=>&#39;test&#39;,&#39;avatar&#39;=>&#39;/path/to/test.jpg&#39;));
        });
    }
other code
}
登入後複製

如果建立一個新的服務提供者來包含視圖composer 註冊,需要新增此服務提供者到設定檔config/app.php 的providers 陣列中

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

<?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(&#39;motto&#39;, $user_info);
        $view->with(&#39;count&#39;, $this->users->count());
    }
}
登入後複製

視圖被渲染前,AuthComposer類別的compose 方法被調用,同時Illuminate\View\View 實例被注入該方法,從而可以使用其with 方法來綁定資料到視圖。

所有的視圖合成器都會透過 服務容器 來解析,所以你可以在視圖合成器的建構函式中型別提示需要注入的依賴項。

相關文章推薦:

詳解Laravel視圖間共享資料與視圖Composer_php實例

Laravel 5框架學習之向視圖傳送數據,laravel框架

以上是laravel5.5框架中視圖間如何共享資料?視圖間共享資料的兩種方法(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!