基本的な使用法
ビューはアプリケーションとして動作するHTMLにより構成されており、コントローラー/アプリケーションロジックをプレゼンテーションロジックから分離します。ビューはresources/views
ディレクトリーに保存します。
シンプルなビューは、以下のような形態です。
<!-- resources/views/greeting.phpとして保存されているビュー -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
このビューをresources/views/greeting.php
として保存した場合、以下のようにグローバルview
ヘルパ関数を使用し結果を返します。
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
ご覧の通り、view
ヘルパに渡している最初の引数は、resources/views
ディレクトリー中のビューファイル名に対応しています。2つ目の引数は、ビューで使用するデータの配列です。この場合、変数をただecho
し、ビューで表示するためのname
変数を渡しています。
もちろん、ビューはresources/views
ディレクトリーのサブディレクトリーにネストすることもできます。ネストしたビューを参照するために「ドット」記法が使えます。例えば、ビューがresources/views/admin/profile.php
として保存するなら、次のように指定します。
return view('admin.profile', $data);
ビューの存在を検査
ビューが存在しているかを判定する必要があれば、view
ヘルパを引数無しで呼び出した後に続けて、exists
メソッドを使用します。このメソッドはビューが存在している場合にtrue
を返します。
if (view()->exists('emails.customer')) {
//
}
view
ヘルパが引数無しで呼び出されると、Illuminate\Contracts\View\Factory
のインスタンスが返されますので、ファクトリーのメソッドが利用できます。
ビューデータ
ビューにデータを渡す
前例で見たように、簡単にデータをビューに渡せます。
return view('greetings', ['name' => 'Victoria']);
この方法で情報を渡す場合、$data
はキー/値ペアの配列です。ビューの中で各値へは対抗するキーでアクセスできます。たとえば<?php echo $key; ?>
のように表示可能です。全データをview
ヘルパ関数に渡す代わりに、with
メソッドでビューに渡すデータを個別に追加することもできます。
$view = view('greeting')->with('name', 'Victoria');
全ビューでデータを共有する
アプリケーションの全ビューで使用するデータを共有したい場合も時々あるでしょう。ビューファクトリーのshare
メソッドが使用できます。通常、サービスプロバイダーのboot
メソッドの中で呼び出します。AppServiceProvider
に追加することできますし、別のプロバイダーを生成し設置することもできます。
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
/**
* アプリケーションサービスの初期処理
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}
/**
* サービスプロバイダー登録
*
* @return void
*/
public function register()
{
//
}
}
ビューコンポーサー
ビューコンポーサーはビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。ビューがレンダーされるたびに結合したい情報があるなら、ビューコンポーサーがロジックを一箇所にまとめるのに役立ちます。
サービスプロバイダーの中にビューコンポーサーを組み込みましょう。View
ファサードで動作しているIlluminate\Contracts\View\Factory
契約の実装にアクセスします。Laravelにはデフォルトのビューコンポーサー置き場を用意していないことに注意してください。お好きな場所に置くことができます。たとえばApp\Http\ViewComposers
ディレクトリーを作成することもできます。
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* コンテナ結合の登録
*
* @return void
*/
public function boot()
{
// クラスベースのコンポーサーを使用する
view()->composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// クロージャーベースのコンポーサーを使用する
view()->composer('dashboard', function ($view) {
});
}
/**
* サービスプロバイダーの登録
*
* @return void
*/
public function register()
{
//
}
}
新しいサービスプロバイダーをビューコンポーサー登録のために作成したら、config/app.php
設定ファイルのproviders
配列へ追加する必要があるのを忘れないでください。
ではprofile
ビューがレンダーされるたび実行される、ProfileComposer@compose
メソッドをコンポーサーとして登録してみましょう。まず、このコンポーサークラスを定義します。
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;
class ProfileComposer
{
/**
* userリポジトリの実装
*
* @var UserRepository
*/
protected $users;
/**
* 新しいプロフィールコンポーサーの生成
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// 依存はサービスコンテナにより自動的に解決される…
$this->users = $users;
}
/**
* データをビューと結合
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
ビューがレンダーされる直前に、Illuminate\View\View
インスタンスに対しコンポーサーのcompose
メソッドが呼びだされます。
注目: すべてのビューコンポーサーはサービスコンテナにより依存解決されます。ですから、コンポーサーのコンストラクターで必要な依存をタイプヒントで指定できます。
複数ビューへの適用
複数のビューにビューコンポーサーを適用するには、composer
メソッドの最初の引数にビューの配列を渡してください。
view()->composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
全ビューコンポーサーに適用できるように、composer
メソッドでは*
をワイルドカードとして使用できます。
view()->composer('*', function ($view) {
//
});
Viewクリエーター
ビュークリエイターは、ビューコンポーサーとほぼ同じ働きをします。しかし、ビューがレンダーされるまで待つのではなく、インスタンス化されるとすぐに実行されます。ビュークリエイターを登録するには、creator
メソッドを使います。
view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');