基本的な使用法

ビューはアプリケーションとして動作する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');