創(chuàng)建視圖
視圖包含應(yīng)用的 HTML 代碼,并將應(yīng)用的控制器邏輯和表現(xiàn)邏輯進(jìn)行分離。視圖文件存放在 resources/views 目錄中。下面是一個(gè)簡(jiǎn)單的視圖示例:
!-- resources/views/greeting.blade.php 視圖文件 -->
html>
body>
h1>Hello, {{ $name }}/h1>
/body>
/html>
可以通過(guò)輔助函數(shù) view ,返回這個(gè)視圖響應(yīng):
Route::get('/', function () {
return view('greeting', ['name' => 'jack']);
});
view 方法的第一個(gè)參數(shù)是 resources/views 目錄下相應(yīng)的視圖文件的名稱,第二個(gè)參數(shù)是一個(gè)數(shù)組,表示傳遞給視圖文件的數(shù)據(jù)。
在這個(gè)例子中,我們傳遞了一個(gè) name 變量,在視圖中通過(guò)使用 Blade 語(yǔ)法將其顯示出來(lái)。
當(dāng)然,視圖還可以存放在 resources/views 的子目錄中,用“.”號(hào)來(lái)引用子目錄中的視圖。
例如,如果視圖存放路徑是 resources/views/admin/profile.blade.php,那么我們可以這樣引用它:
return view('admin.profile', $data);
判斷視圖是否存在
如果需要判斷視圖是否存在,可調(diào)用 View 門面上的 exists 方法,如果視圖存在則返回 true:
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
創(chuàng)建第一個(gè)有效視圖
調(diào)用 View 門面上的 first 方法,可以用于創(chuàng)建給定視圖數(shù)組中的第一個(gè)存在的視圖:
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
這個(gè)功能在應(yīng)用或擴(kuò)展包允許視圖被自定義或覆蓋時(shí)很有用。
傳遞數(shù)據(jù)到視圖
可以簡(jiǎn)單通過(guò)數(shù)組方式將數(shù)據(jù)傳遞到視圖:
return view('greeting', ['name' => 'jack']);
除此之外,還可以通過(guò) with 方法傳遞獨(dú)立的數(shù)據(jù)片段到視圖:
$view = view('greeting')->with('name', 'jack');
在視圖間共享數(shù)據(jù)
有時(shí)候,我們需要在所有視圖之間共享數(shù)據(jù)片段,這時(shí)可以使用視圖門面的 share 方法,通常,需要在某個(gè)服務(wù)提供者的 boot 方法中調(diào)用 share 方法,你可以將其添加到 AppServiceProvider 或生成獨(dú)立的服務(wù)提供者來(lái)存放這段代碼邏輯:
?php
namespace App\Providers;
use View;
class AppServiceProvider extends ServiceProvider
{
/**
* 啟動(dòng)所有應(yīng)用服務(wù)
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* 注冊(cè)服務(wù)提供者
*
* @return void
*/
public function register()
{
//
}
}
視圖 Composer
視圖 Composer 是當(dāng)視圖被渲染時(shí)的回調(diào)函數(shù)或類方法。
如果你有一些數(shù)據(jù)需要在視圖每次渲染時(shí)都做綁定,可以使用視圖 Composer 將邏輯組織到一個(gè)單獨(dú)的地方。
在本例中,首先要在某個(gè)服務(wù)提供者中注冊(cè)視圖 Composer,我們將會(huì)使用 View 門面來(lái)訪問 Illuminate\Contracts\View\Factory 的底層實(shí)現(xiàn),記住,Laravel 不會(huì)包含默認(rèn)的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創(chuàng)建一個(gè) app/Http/ViewComposers 目錄:
?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* 在容器中注冊(cè)綁定.
*
* @return void
*/
public function boot()
{
// 使用基于類方法的 composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// 使用基于回調(diào)函數(shù)的 composers...
View::composer('dashboard', function ($view) {});
}
/**
* 注冊(cè)服務(wù)提供者.
*
* @return void
*/
public function register()
{
//
}
}
注:如果創(chuàng)建一個(gè)新的服務(wù)提供者來(lái)包含視圖 Composer 注冊(cè),需要添加該服務(wù)提供者到配置文件 config/app.php 的 providers 數(shù)組中。
現(xiàn)在我們已經(jīng)注冊(cè)了視圖 Composer,每次 profile 視圖被渲染時(shí)都會(huì)執(zhí)行 ProfileComposer@compose 方法,接下來(lái)我們來(lái)定義該 Composer 類:
?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use Illuminate\Repositories\UserRepository;
class ProfileComposer
{
/**
* 用戶倉(cāng)庫(kù)實(shí)現(xiàn).
*
* @var UserRepository
*/
protected $users;
/**
* 創(chuàng)建一個(gè)新的屬性composer.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// 依賴注入通過(guò)服務(wù)容器自動(dòng)解析...
$this->users = $users;
}
/**
* 綁定數(shù)據(jù)到視圖.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
視圖被渲染前,Composer 類的 compose 方法被調(diào)用,同時(shí) Illuminate\View\View 實(shí)例被注入該方法,從而可以使用其 with 方法來(lái)綁定數(shù)據(jù)到視圖。
注:所有視圖 Composer 都通過(guò)服務(wù)容器被解析,所以你可以在 Composer 類的構(gòu)造函數(shù)中聲明任何你需要的依賴。
添加 Composer 到多個(gè)視圖
你可以傳遞視圖數(shù)組作為 composer 方法的第一個(gè)參數(shù)來(lái)一次性將視圖 Composer 添加到多個(gè)視圖:
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
composer 方法還支持 * 通配符,允許將一個(gè) Composer 添加到所有視圖:
View::composer('*', function ($view) {
//
});
視圖創(chuàng)建器
視圖創(chuàng)建器和視圖 Composer 非常類似,不同之處在于前者在視圖實(shí)例化之后立即失效而不是等到視圖即將渲染。
使用 View 門面的 creator 方法即可注冊(cè)一個(gè)視圖創(chuàng)建器:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
以上這篇Laravel5.5 視圖 - 創(chuàng)建視圖和數(shù)據(jù)傳遞示例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Laravel 5框架學(xué)習(xí)之向視圖傳送數(shù)據(jù)
- Laravel 5框架學(xué)習(xí)之模型、控制器、視圖基礎(chǔ)流程
- Laravel 5框架學(xué)習(xí)之向視圖傳送數(shù)據(jù)(進(jìn)階篇)
- Laravel 5框架學(xué)習(xí)之路由、控制器和視圖簡(jiǎn)介
- Laravel 5框架學(xué)習(xí)之子視圖和表單復(fù)用
- Laravel框架實(shí)現(xiàn)多個(gè)視圖共享相同數(shù)據(jù)的方法詳解
- laravel框架模型、視圖與控制器簡(jiǎn)單操作示例
- laravel通過(guò)a標(biāo)簽從視圖向控制器實(shí)現(xiàn)傳值
- Laravel實(shí)現(xiàn)通過(guò)blade模板引擎渲染視圖
- laravel框架中視圖的基本使用方法分析