Skip to content

ビュー

イントロダクション

もちろん、ルートやコントローラから直接HTMLドキュメント全体の文字列を返すのは現実的ではありません。幸いなことに、ビューはすべてのHTMLを別々のファイルに配置する便利な方法を提供します。

ビューは、コントローラ/アプリケーションロジックをプレゼンテーションロジックから分離し、resources/viewsディレクトリに保存されます。Laravelを使用する場合、ビューテンプレートは通常Bladeテンプレート言語を使用して記述されます。シンプルなビューは次のようになります:

<!-- ビューはresources/views/greeting.blade.phpに保存されています -->

<html>
    <body>
        <h1>Hello, {{ $name }}</h1>
    </body>
</html>

このビューがresources/views/greeting.blade.phpに保存されている場合、グローバルなviewヘルパーを使用して次のように返すことができます:

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

Note

Bladeテンプレートの記述方法について詳しく知りたい場合は、Bladeドキュメントを参照してください。

React / Vue でのビューの記述

Bladeを介してPHPでフロントエンドテンプレートを記述する代わりに、多くの開発者はテンプレートをReactまたはVueを使用して記述することを好みます。LaravelはInertiaのおかげで、React/VueのフロントエンドをLaravelのバックエンドに結びつけるのが簡単になります。

BreezeとJetstreamのスターターキットは、Inertiaを搭載した次のLaravelアプリケーションのための素晴らしい出発点を提供します。さらに、Laravel Bootcampは、VueとReactの例を含む、Inertiaを搭載したLaravelアプリケーションの構築の完全なデモンストレーションを提供します。

ビューの作成とレンダリング

アプリケーションのresources/viewsディレクトリに.blade.php拡張子を持つファイルを配置するか、make:view Artisanコマンドを使用してビューを作成できます:

php artisan make:view greeting

.blade.php拡張子は、ファイルがBladeテンプレートを含んでいることをフレームワークに通知します。BladeテンプレートにはHTMLと、値を簡単に出力したり、"if"文を作成したり、データを反復処理したりするためのBladeディレクティブが含まれます。

ビューを作成したら、アプリケーションのルートまたはコントローラからグローバルなviewヘルパーを使用して返すことができます:

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

ビューはViewファサードを使用して返すこともできます:

use Illuminate\Support\Facades\View;

return View::make('greeting', ['name' => 'James']);

ご覧のように、viewヘルパーに渡される最初の引数は、resources/viewsディレクトリ内のビューファイルの名前に対応しています。2番目の引数は、ビューで利用可能にする必要があるデータの配列です。この場合、name変数を渡しています。これはBlade構文を使用してビューに表示されます。

ネストされたビューディレクトリ

ビューはresources/viewsディレクトリのサブディレクトリ内にもネストされることがあります。"ドット"記法を使用してネストされたビューを参照できます。たとえば、ビューがresources/views/admin/profile.blade.phpに保存されている場合、アプリケーションのルート/コントローラから次のように返すことができます:

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

Warning

ビューディレクトリ名には.文字を含めないでください。

最初に利用可能なビューの作成

Viewファサードのfirstメソッドを使用して、指定されたビューの配列の中で最初に存在するビューを作成できます。これは、アプリケーションまたはパッケージがビューをカスタマイズまたは上書きできる場合に便利です:

use Illuminate\Support\Facades\View;

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

ビューが存在するかどうかの判定

ビューが存在するかどうかを判定する必要がある場合は、Viewファサードを使用できます。existsメソッドは、ビューが存在する場合にtrueを返します:

use Illuminate\Support\Facades\View;

if (View::exists('admin.profile')) {
    // ...
}

ビューへのデータの受け渡し

前の例で見たように、ビューにデータの配列を渡して、そのデータをビューで利用可能にすることができます:

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

この方法で情報を渡す場合、データはキー/値のペアを持つ配列である必要があります。ビューにデータを提供した後、データのキーを使用してビュー内で各値にアクセスできます。例えば<?php echo $name; ?>のように。

viewヘルパー関数に完全なデータ配列を渡す代わりに、withメソッドを使用してビューに個々のデータを追加することもできます。withメソッドはビューオブジェクトのインスタンスを返すため、ビューを返す前にメソッドを連鎖させることができます:

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

すべてのビューとデータの共有

アプリケーションによってレンダリングされるすべてのビューとデータを共有する必要がある場合があります。Viewファサードのshareメソッドを使用して行うことができます。通常、shareメソッドの呼び出しはサービスプロバイダのbootメソッド内に配置する必要があります。App\Providers\AppServiceProviderクラスに追加するか、それらを格納するための別のサービスプロバイダを生成することができます:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 任意のアプリケーションサービスの登録。
     */
    public function register(): void
    {
        // ...
    }

    /**
     * 任意のアプリケーションサービスのブートストラップ。
     */
    public function boot(): void
    {
        View::share('key', 'value');
    }
}

ビューコンポーザ

ビューコンポーザは、ビューがレンダリングされるときに呼び出されるコールバックまたはクラスメソッドです。ビューがレンダリングされるたびにビューにバインドしたいデータがある場合、ビューコンポーザはそのロジックを1つの場所に整理するのに役立ちます。ビューコンポーザは、アプリケーション内の複数のルートまたはコントローラから同じビューが返され、常に特定のデータが必要な場合に特に便利です。

通常、ビューコンポーザはアプリケーションのサービスプロバイダの1つに登録されます。この例では、App\Providers\AppServiceProviderがこのロジックを格納すると仮定します。

Viewファサードのcomposerメソッドを使用してビューコンポーザを登録します。Laravelにはクラスベースのビューコンポーザのためのデフォルトディレクトリは含まれていないため、自由に整理することができます。たとえば、アプリケーションのすべてのビューコンポーザを格納するためにapp/View/Composersディレクトリを作成することができます:

<?php

namespace App\Providers;

use App\View\Composers\ProfileComposer;
use Illuminate\Support\Facades;
use Illuminate\Support\ServiceProvider;
use Illuminate\View\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 任意のアプリケーションサービスの登録。
     */
    public function register(): void
    {
        // ...
    }

    /**
     * 任意のアプリケーションサービスのブートストラップ。
     */
    public function boot(): void
    {
        // クラスベースのコンポーザを使用...
        Facades\View::composer('profile', ProfileComposer::class);

        // クロージャベースのコンポーザを使用...
        Facades\View::composer('welcome', function (View $view) {
            // ...
        });

        Facades\View::composer('dashboard', function (View $view) {
            // ...
        });
    }
}

これで、ビューコンポーザが登録されたので、profileビューがレンダリングされるたびにApp\View\Composers\ProfileComposerクラスのcomposeメソッドが実行されます。ビューコンポーザクラスの例を見てみましょう:

<?php

namespace App\View\Composers;

use App\Repositories\UserRepository;
use Illuminate\View\View;

class ProfileComposer
{
    /**
     * 新しいプロフィールコンポーザを作成します。
     */
    public function __construct(
        protected UserRepository $users,
    ) {}

    /**
     * ビューにデータをバインドします。
     */
    public function compose(View $view): void
    {
        $view->with('count', $this->users->count());
    }
}

ご覧のように、すべてのビューコンポーザはサービスコンテナを介して解決されるため、コンポーザのコンストラクタ内で必要な依存関係をタイプヒントで指定できます。

複数のビューへのコンポーザのアタッチ

composerメソッドの最初の引数としてビューの配列を渡すことで、一度に複数のビューにビューコンポーザをアタッチできます:

use App\Views\Composers\MultiComposer;
use Illuminate\Support\Facades\View;

View::composer(
    ['profile', 'dashboard'],
    MultiComposer::class
);
View::composer(
    ['profile', 'dashboard'],
    MultiComposer::class
);

composerメソッドは、ワイルドカードとして*文字も受け入れるため、コンポーザーをすべてのビューにアタッチすることができます:

use Illuminate\Support\Facades;
use Illuminate\View\View;

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

ビュークリエイター

ビュー「クリエイター」はビューコンポーザーと非常によく似ていますが、ビューがレンダリングされる直前ではなく、ビューがインスタンス化された直後に実行されます。ビュークリエイターを登録するには、creatorメソッドを使用します:

use App\View\Creators\ProfileCreator;
use Illuminate\Support\Facades\View;

View::creator('profile', ProfileCreator::class);

ビューの最適化

デフォルトでは、Bladeテンプレートビューは必要に応じてコンパイルされます。ビューをレンダリングするリクエストが実行されると、Laravelはビューのコンパイル済みバージョンが存在するかどうかを判断します。ファイルが存在する場合、Laravelは未コンパイルのビューがコンパイル済みビューよりも最近に変更されたかどうかを判断します。コンパイル済みビューが存在しないか、未コンパイルビューが変更されている場合、Laravelはビューを再コンパイルします。

リクエスト中にビューをコンパイルすると、パフォーマンスにわずかなマイナスの影響がある可能性があります。そのため、Laravelはview:cache Artisanコマンドを提供し、アプリケーションで使用されるすべてのビューを事前にコンパイルします。パフォーマンスを向上させるために、このコマンドをデプロイプロセスの一部として実行することをお勧めします:

php artisan view:cache

ビューキャッシュをクリアするには、view:clearコマンドを使用できます:

php artisan view:clear

ユーザーノート