ビュー
画面の見た目を書いたファイル「ビュー」の作り方と返し方を説明します。データの渡し方・全部のビューへの共有・ビューコンポーザー・キャッシュによる高速化まで引けます。
ビューは、画面の見た目(HTML)を書いたファイルです。ルートやコントローラーの中に、HTML の文字を全部書くのは大変です。そこで HTML を別のファイルに分けて置きます。お店でいえば、接客の係(コントローラー)とは別に、お店の看板やメニューを作る係がいるようなものです。
ビューは、アプリの処理と、見た目を分けるためのもので、resources/views フォルダに置きます。Laravel では、ふつう、Blade(Laravel のテンプレートの書き方)で書きます。簡単なビューは、次のようになります。
<!-- 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']);
});
補足
Blade の書き方は、Blade テンプレートで説明しています。
React・Svelte・Vue でビューを書く#
画面を、Blade ではなく、React・Svelte・Vue(どれも JavaScript で画面を作る道具)で書く人も増えています。Inertia というライブラリ(便利な部品のまとまり)を使うと、こうした画面を Laravel とかんたんにつなげられます。SPA(ページを切り替えずに動かすアプリ)を作るときのような、面倒な手間はかかりません。
React・Svelte・Vue のスターターキットは、Inertia を使った新しいアプリの、よい出発点になります。
ビューを作って表示する#
ビューは、resources/views フォルダに、拡張子(ファイル名の最後の部分)が .blade.php のファイルを置いて作ります。make:view という Artisan コマンド(php artisan で動かす Laravel のコマンド)でも作れます。
php artisan make:view greeting
.blade.php という拡張子は、そのファイルが Blade のテンプレートだと、Laravel に伝えます。Blade のテンプレートには、HTML のほかに、Blade のディレクティブ(@ で始まる命令)を書けます。値を出す、「もし〜なら」を書く、データを順に処理する、といったことが簡単にできます。
ビューを作ったら、ルートやコントローラーから、view ヘルパー関数で返します。
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
View ファサード(クラス名と :: で呼べる窓口)でも、ビューを返せます。
use Illuminate\Support\Facades\View;
return View::make('greeting', ['name' => 'James']);
view の1つ目の引数は、resources/views フォルダの中の、ビューのファイルの名前です。2つ目の引数は、ビューで使えるようにするデータの配列です。この例では name の変数を渡していて、ビューの中で、Blade の書き方で表示しています。
フォルダの中のビュー#
ビューは、resources/views の中のフォルダにも置けます。フォルダの中のビューは、ドット(.)でつないだ名前で呼びます。たとえば、resources/views/admin/profile.blade.php にあるビューは、次のように返します。
return view('admin.profile', $data);
注意
ビューを置くフォルダの名前に、. を使ってはいけません。
最初に見つかったビューを使う#
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; ?> と書けば、表示できます(Blade なら {{ $name }} です)。
配列をまるごと渡す代わりに、with メソッドで、1つずつデータを足せます。with は、ビューのオブジェクトを返すので、続けてメソッドをつなげられます。
return view('greeting')
->with('name', 'Victoria')
->with('occupation', 'Astronaut');
すべてのビューにデータを共有する#
アプリが表示するすべてのビューに、同じデータを渡したいことがあります。View ファサードの share メソッドを使います。ふつうは、サービスプロバイダ(アプリの起動のときに、道具箱へ道具を登録する場所)の boot メソッドの中で呼びます。App\Providers\AppServiceProvider に書いても、そのための専用のサービスプロバイダを作ってもかまいません。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}
/**
* Bootstrap any application services.
*/
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
{
/**
* Register any application services.
*/
public function register(): void
{
// ...
}
/**
* Bootstrap any application services.
*/
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
{
/**
* Create a new profile composer.
*/
public function __construct(
protected UserRepository $users,
) {}
/**
* Bind data to the view.
*/
public function compose(View $view): void
{
$view->with('count', $this->users->count());
}
}
ビューコンポーザーは、すべてサービスコンテナ(クラスを作って渡してくれる道具箱)から作られます。そのため、必要な部品は、コンストラクタ(クラスを作るときに動く部分)に型を書けば、受け取れます。
コンポーザーを複数のビューに付ける#
composer の1つ目の引数に、ビューの配列を渡すと、複数のビューに、1つのコンポーザーを付けられます。
use App\Views\Composers\MultiComposer;
use Illuminate\Support\Facades\View;
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);
| メソッド | 説明 |
|---|---|
View::share |
すべてのビューへ、同じデータを渡す |
View::composer |
ビューを表示するときに動く処理を登録する |
View::creator |
ビューを作った直後に動く処理を登録する |
View::first |
配列のうち、最初に存在するビューを作る |
View::exists |
ビューがあるか調べる |
View::make |
ビューを作る |
ビューを速くする#
Blade のビューは、ふつう、必要になったときにコンパイル(実行しやすい形への変換)されます。ビューを表示するリクエストが来ると、Laravel は、コンパイル済みのものがあるかを調べます。あれば、元のビューが、そのあとに変更されたかを調べます。コンパイル済みのものがないか、元のビューが変更されていれば、コンパイルし直します。
リクエストの途中でコンパイルすると、わずかに速さが落ちることがあります。そこで、アプリで使うすべてのビューを、前もってコンパイルしておく、view:cache という Artisan コマンドがあります。速くしたいときは、公開(デプロイ)の手順の一部として、このコマンドを動かすとよいでしょう。
php artisan view:cache
ビューのキャッシュ(作った結果を取っておいたもの)は、view:clear コマンドで消せます。
php artisan view:clear
| コマンド | 説明 |
|---|---|
make:view |
ビューのファイルを作る |
view:cache |
すべてのビューを、前もってコンパイルする |
view:clear |
コンパイルしたビューのキャッシュを消す |
関連するページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。