Laravel5.5 LTS 日本語ドキュメント

このリポジトリはPHP Webアプリフレームワークである、LaravelのLTSバージョンである5.5の公式英文ドキュメントを日本語へ翻訳しています。

This project is maintained by okinaka

ビュー

ビューの作成

{tip} Bladeテンプレートをどう書いたら良いのかをもっと知りたいですか?取り掛かるには、Bladeのドキュメントを確認してください。

ビューはアプリケーションとして動作するHTMLにより構成されており、コントローラ/アプリケーションロジックをプレゼンテーションロジックから分離します。ビューはresources/viewsディレクトリに保存します。 シンプルなビューは、以下のような形態です。

<!-- resources/views/greeting.blade.phpとして保存されているビュー -->

<html>
    <body>
        <h1>Hello, </h1>
    </body>
</html>

このビューをresources/views/greeting.blade.phpとして保存していますので、以下のようにグローバルviewヘルパ関数を使用し結果を返します。

Route::get('/', function () {
    return view('greeting', ['name' => 'James']);
});

ご覧の通り、viewヘルパに渡している最初の引数は、resources/viewsディレクトリ中のビューファイル名に対応しています。2つ目の引数は、ビューで使用するデータの配列です。上記の例では、ビューにname変数を渡し、それはBlade記法を使用しているビューの中に表示されます。

もちろん、ビューはresources/viewsディレクトリのサブディレクトリにネストすることもできます。ネストしたビューを参照するために「ドット」記法が使えます。例えば、ビューがresources/views/admin/profile.blade.phpとして保存するなら、次のように指定します。

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

ビューの存在を検査

ビューが存在しているかを判定する必要があれば、Viewファサードを使います。ビューが存在していれば、existsメソッドはtrueを返します。

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    //
}

利用可能な最初のViewの作成

firstメソッドは、指定したビュー配列の中で、最初に存在するビューを作成します。これはアプリケーションやパッケージで、ビューをカスタマイズ、上書きする場合に役立ちます。

return view()->first(['custom.admin', 'admin'], $data);

もちろん、Viewファサードを使い、このメソッドを呼び出すこともできます。

use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

ビューにデータを渡す

前例で見たように、簡単にデータを配列でビューに渡せます。

return view('greetings', ['name' => 'Victoria']);

この方法で情報を渡す場合、その情報はキー/値ペアの配列です。ビューの中で各値へは対抗するキーでアクセスできます。たとえば<?php echo $key; ?>のように表示可能です。全データをviewヘルパ関数に渡す代わりに、withメソッドでビューに渡すデータを個別に追加することもできます。

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

全ビュー間のデータ共有

アプリケーションでレンダーする全ビューに対し、一部のデータを共有する必要があることも多いと思います。Viewファサードのshareメソッドを使ってください。 通常、サービスプロバイダのbootメソッド内でshareを呼び出します。AppServiceProviderに追加しても良いですし、独立したサービスプロバイダを作成することもできます。

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

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\Facades\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()
    {
        //
    }
}

{note} 新しいサービスプロバイダをビューコンポーザ登録のために作成したら、config/app.php設定ファイルのproviders配列へ追加する必要があるのを忘れないでください。

ではprofileビューがレンダーされるたび実行される、ProfileComposer@composeメソッドをコンポーザとして登録してみましょう。まず、このコンポーザクラスを定義します。

<?php

namespace App\Http\ViewComposers;

use Illuminate\View\View;
use App\Repositories\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メソッドが呼びだされます。

{tip} すべてのビューコンポーザはサービスコンテナにより依存解決されます。ですから、コンポーザのコンストラクターで必要な依存をタイプヒントで指定できます。

複数ビューへの適用

複数のビューにビューコンポーザを適用するには、composerメソッドの最初の引数にビューの配列を渡してください。

View::composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

全ビューコンポーザに適用できるように、composerメソッドでは*をワイルドカードとして使用できます。

View::composer('*', function ($view) {
    //
});

Viewクリエーター

ビュークリエイターは、ビューコンポーザとほぼ同じ働きをします。しかし、ビューがレンダーされるまで待つのではなく、インスタンス化されるとすぐに実行されます。ビュークリエイターを登録するには、creatorメソッドを使います。

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