基本的な使用法
ビューはアプリケーションで動くHTMLにより構成されており、コントローラーとドメインロジックをプレゼンテーションロジックから分離するための便利な手法として役立ちます。ビューはresources/views
ディレクトリーに保存します。
シンプルなビューは、以下のような形態です。
<!-- resources/views/greeting.phpとして保存されているビュー -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
ビューは次のように、ブラウザーへ送り返します。
Route::get('/', function()
{
return view('greeting', ['name' => 'James']);
});
ご覧の通り、view
ヘルパに渡している最初の引数は、resources/views
ディレクトリー中のビューファイル名に対応しています。2つ目の引数は、ビューで使用するデータの配列です。
もちろん、ビューは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
ヘルパの第2引数にデーターの配列を渡すこともできます。
$view = view('greetings', $data);
この方法で情報を渡す場合、$data
はキー/値ペアの配列です。ビューの中で各値へは対抗するキーでアクセスできます。$data['key']
が存在する場合、{{ $key }}
のようにです。
全ビューとのデータ共有
たまにアプリケーションの全ビューで表示される一部のデータを共有したい場合もあるでしょう。いくつかの選択肢があり、view
ヘルパかIlluminate\Contracts\View\Factory
契約、ワイルドカードビューコンポーサーです。
view
ヘルパを使用する例です。
view()->share('data', [1, 2, 3]);
View
ファサードを使用することもできます。
View::share('data', [1, 2, 3]);
通常、サービスプロバイダーのboot
メソッドの中で、share
メソッドを呼び出します。自由にAppServiceProvider
へ付け足すか、専用のサービスプロバイダーを生成してコードを書きましょう。
注目:
view
ヘルパを引数なしで呼び出すと、Illuminate\Contracts\View\Factory
契約の実装が返されます。
ビューの存在判定
ビューが存在しているかを判定する必要があるなら、exists
メソッドを使用します。
if (view()->exists('emails.customer'))
{
//
}
ファイルパス指定によるビュー生成
ご希望なら、絶対ファイルパスを指定し、ビューを生成することもできます。
return view()->file($pathToFile, $data);
ビューコンポーサー
ビューコンポーサーは、ビューがレンダーされる時に呼び出される、コールバックかクラスメソッドのことです。もし、ビューがレンダーされるたびに、結合したい情報があるなら、ビューコンポーサーがロジックを一箇所にまとめるのに役立ちます。
ビューコンポーサーの定義
サービスプロバイダーの中にビューコンポーサーを組み込みましょう。View
ファサードで動作しているIlluminate\Contracts\View\Factory
契約の実装にアクセスします。
<?php namespace App\Providers;
use View;
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()
{
//
}
}
注意: Laravelはビューコンポーサー用のディレクトリーをデフォルトで用意していません。お好きな場所に作成してください。例えば、
App\Http\ViewComposers
ディレクトリーを作成できます。
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 {
/**
* ユーザーリポジトリーの実装
*
* @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());
}
}
ビューがレンダーされる直前に、コンポーサーのcompose
メソッドがIlluminate\Contracts\View\View
インスタンスで呼び出されます。ビューにデーターを結合するために、with
メソッドを使うこともできます。
注目: すべてのビューコンポーサーはサービスコンテナにより依存解決されます。ですから、コンポーサーのコンストラクターに必要な依存をタイプヒントで指定できます。
ワイルドカードビューコンポーサー
composer
メソッドは、*
文字をワイルドカードとして扱います。そのため、次のように全ビューにコンポーサーを指定できます。
View::composer('*', function($view)
{
//
});
複数ビューへの適用
また、複数のビューに対し、一度にビューコンポーサーを指定することもできます。
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');