天天看點

php deel views,視圖 - ViewsHello, <?php echo $name; ?>

視圖 (View)

基本用法

視圖裡面包含了你應用程式所提供的 HTML 代碼,并且提供一個簡單的方式來分離控制器和網頁呈現上的邏輯。視圖被儲存在 resources/views 檔案夾内。

一個簡單的視圖看起來可能像這樣:

Hello, <?php echo $name; ?>

這個視圖可以使用以下的代碼傳遞到使用者的浏覽器:

Route::get('/', function()

{

return view('greeting', ['name' => 'James']);

});

如你所見,view 輔助方法的第一個參數會對應到 resources/views 檔案夾内視圖檔案的名稱;傳遞到 view 輔助方法的第二個參數是一個能夠在視圖内取用的資料數組。

當然,視圖檔案也可以被存放在 resources/views 的子檔案夾内。舉例來說,如果你的視圖檔案儲存在 resources/views/admin/profile.php,你可以用以下的代碼來傳回:

return view('admin.profile', $data);

傳遞資料到視圖

// 使用傳統的方法

$view = view('greeting')->with('name', 'Victoria');

// 使用魔術方法

$view = view('greeting')->withName('Victoria');

在上面的例子代碼中,視圖将可以使用 $name 來取得資料,其值為 Victoria。

如果你想的話,還有一種方式就是直接在 view 輔助方法的第二個參數直接傳遞一個數組:

$view = view('greetings', $data);

把資料共享給所有視圖

有時候你可能需要共享一些資料給你的所有視圖,你有很多個選擇:view 輔助方法;Illuminate\Contracts\View\Factory合約 (contract);在 視圖元件 (view composer) 内使用通配符。

這裡有個 view 輔助方法的例子:

view()->share('data', [1, 2, 3]);

你也可以使用 view 的 Facade:

View::share('data', [1, 2, 3]);

通常你應該在服務提供者的 boot 方法内使用 share 方法。你可以選擇加在 AppServiceProvider 或者是建立一個單獨的服務提供者來容納這些代碼。

備注: 當 view 輔助方法沒有帶入任何參數調用時,它将會傳回一個的 Illuminate\Contracts\View\Factory 合約 (contract) 的實作 (implementation)。

确認視圖是否存在

如果你需要确認視圖是否存在,使用 exists 方法:

if (view()->exists('emails.customer'))

{

//

}

從一個檔案路徑産生視圖

你可以從一個完整的檔案路徑來産生一個視圖:

return view()->file($pathToFile, $data);

視圖元件

視圖元件就是在視圖被渲染前,會調用的閉包或類方法。如果你想在每次渲染某些視圖時綁定資料,視圖元件可以把這樣的程式邏輯組織在同一個地方。

定義一個視圖元件

讓我們在 服務提供者 内組織我們的視圖元件。底下例子将使用 View Facade 來取得底層 Illuminate\Contracts\View\Factory合約的實作:

use View;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {

public function boot()

{

// 使用類來指定視圖元件

View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');

// 使用閉包來指定視圖元件

View::composer('dashboard', function()

{

});

}

public function register()

{

//

}

}

備注: Laravel 沒有預設的檔案夾來放置類形式的視圖元件。你可以自由的把它們放在你想要的地方。舉例來說,你可以放在 App\Http\ViewComposers 檔案夾内。

記得要把這個服務提供者添加到 config/app.php 配置檔案的 providers 數組中。

現在我們已經注冊了視圖元件,并且在每次 profile 視圖渲染的時候,[email protected] 都将會被執行。接下來我們來看看這個類要如何定義:

use Illuminate\Contracts\View\View;

use Illuminate\Users\Repository as UserRepository;

class ProfileComposer {

protected $users;

public function __construct(UserRepository $users)

{

// service container 會自動解析所需的參數

$this->users = $users;

}

public function compose(View $view)

{

$view->with('count', $this->users->count());

}

}

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

備注: 所有的視圖元件會被 服務容器 (service container) 解析,是以你需要在視圖元件的構造器類型限制你所需的任何依賴參數。

在視圖元件内使用通配符

View 的 composer 方法可以接受 * 作為通配符,是以你可以對所有視圖附加 composer 如下:

View::composer('*', function()

{

//

});

同時對多個視圖附加視圖元件

你也可以同時針對多個視圖附加同一個視圖元件:

View::composer(['profile', 'dashboard'], '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'

]);

視圖建立者

視圖 建立者 幾乎和視圖元件運作方式一樣;隻是視圖建立者會在視圖初始化後就立刻執行。要注冊一個建立者,隻要使用 creator 方法:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');