本文實例講述了Laravel5.4框架中視圖共享數據的方法。分享給大家供大家參考,具體如下:
每個人都會遇到這種情況:某些數據還在每個頁面進行使用,比如用戶信息,或者菜單數據,最基本的做法是在每個視圖空控制器中傳入這些數據,但顯然并不是我們想要的結果。另一種方法就是使用視圖數據共享,視圖數據共享的基本使用很簡單,可查看視圖文檔了解詳情,這里我們演示兩個使用示例:在視圖間共享數據和視圖Composer
在視圖中共享數據
除了在單個視圖中傳遞指定數據之外,有時候需要在所有視圖中傳入同一數據,即我們需要在不同視圖中共享數據。要實現這一目的,需要使用視圖工廠的share方法。
全局幫助函數view和response類似,如果傳入參數,則返回Illuminate\View\View實例,不傳入參數則返回Illuminate\View\Factory實例。所以我們可以通過在服務提供者的boot方法中使用如下方式實現視圖間共享數據:
?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//視圖間共享數據
view()->share('name','高偉');
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
接下來我直接用一個空的Laravel項目做演示,我們在 routes 文件首頁(welcome.blade.php)視圖:
Route::get('/', function () {
return view('welcome');
});
然后在視圖中輸出視圖共享數據:
!DOCTYPE html>
html>
head>
title>Laravel/title>
style>
html, body {
height: 100%;
}
body {
margin: 0;
padding: 0;
width: 100%;
display: table;
font-weight: 100;
font-family: 'Lato';
}
.container {
text-align: center;
display: table-cell;
vertical-align: middle;
}
.content {
text-align: center;
display: inline-block;
}
.title {
font-size: 96px;
}
/style>
/head>
body>
div class="container">
div class="content">
div class="title">Laravel 5/div>
h1>hello,{{$name}}/h1>
/div>
/div>
/body>
/html>
視圖Composer
上面的一種做法雖然可行,但是在別人下載項目后,共享數據是從數據庫中獲取的,執行數據遷移的時候會報錯。這時候我們就要用到視圖Composer,視圖Composer通過視圖工廠的composer方法實現。該方法的第二個回調參數支持基于控制器動作和閉包函數兩種方式。
控制器的動作方式
首先要在服務提供者中注冊視圖 Composer,我們將會使用輔助函數 view 來訪問 Illuminate\Contracts\View\Factory 的底層實現,記住,Laravel 不會包含默認的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創建一個 App\Http\ViewComposers 目錄:
?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
/**
* 基于類的實現方式
*/
class MottoComposer
{
/**
* 共享數據
* @date 2018-01-13
* @author 高偉
* @param View $view [description]
* @return [type] [description]
*/
public function compose(View $view)
{
$view->with('motto', '嘎嘎嘎,我一直在努力!');
}
}
然后我們在 AppServiceProvider 中繼續添加共享數據:
?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
view()->share('name','高偉');
// 使用基于類的composers...第一個參數可以指定共享給那個視圖,多個視圖用數組,共享到全部視圖可以用 *
view()->composer(
'welcome', 'App\Http\ViewComposers\MottoComposer'
);
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
在視圖中顯示共享數據:
...
div class="content">
div class="title">Laravel 5/div>
h1>hello,{{$name}}/h1>
p>{{$motto}}/p>
/div>
...
閉包實現方式
閉包的實現方式相對來說簡單很多,這里就簡單貼書代碼:
?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
view()->share('name','高偉');
// 使用基于類的composers...
view()->composer(
'welcome', 'App\Http\ViewComposers\MottoComposer'
);
// 閉包實現方式
view()->composer('*',function($view)
{
$view->with('info','http://www.iwanli.me');
});
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
視圖中顯示數據:
...
div class="content">
div class="title">Laravel 5/div>
h1>hello,{{$name}}/h1>
p>{{$motto}}/p>
p>{{$info}}/p>
/div>
...
更多關于Laravel相關內容感興趣的讀者可查看本站專題:《Laravel框架入門與進階教程》、《php優秀開發框架總結》、《php面向對象程序設計入門教程》、《php+mysql數據庫操作入門教程》及《php常見數據庫操作技巧匯總》
希望本文所述對大家基于Laravel框架的PHP程序設計有所幫助。
您可能感興趣的文章:- laravel框架模型、視圖與控制器簡單操作示例
- Laravel 5框架學習之模型、控制器、視圖基礎流程
- Laravel 5框架學習之路由、控制器和視圖簡介
- laravel通過a標簽從視圖向控制器實現傳值
- 跟我學Laravel之視圖 & Response
- Laravel 5框架學習之向視圖傳送數據
- Laravel 5框架學習之子視圖和表單復用
- Laravel框架學習筆記(二)項目實戰之模型(Models)
- Laravel模型事件的實現原理詳解
- Laravel框架控制器,視圖及模型操作圖文詳解