はじめに

Laravel Folio は、Laravel アプリケーションのルーティングを簡素化するために設計された強力なページベースのルーターです。Laravel Folio を使用すると、ルートを生成することが、アプリケーションの resources/views/pages ディレクトリ内に Blade テンプレートを作成するのと同じくらい簡単になります。

たとえば、/greeting URL でアクセス可能なページを作成するには、アプリケーションの resources/views/pages ディレクトリに greeting.blade.php ファイルを作成するだけです:

  1. <div>
  2. Hello World
  3. </div>

インストール

始めるには、Composer パッケージマネージャーを使用してプロジェクトに Folio をインストールします:

  1. composer require laravel/folio

Folio をインストールした後、folio:install Artisan コマンドを実行して、Folio のサービスプロバイダーをアプリケーションにインストールできます。このサービスプロバイダーは、Folio がルート / ページを検索するディレクトリを登録します:

  1. php artisan folio:install

ページパス / URI

デフォルトでは、Folio はアプリケーションの resources/views/pages ディレクトリからページを提供しますが、Folio サービスプロバイダーの boot メソッドでこれらのディレクトリをカスタマイズできます。

たとえば、同じ Laravel アプリケーション内で複数の Folio パスを指定することが便利な場合があります。アプリケーションの「admin」エリア用に Folio ページの別のディレクトリを持ち、アプリケーションの残りのページには別のディレクトリを使用したい場合があります。

これを Folio::path および Folio::uri メソッドを使用して実現できます。path メソッドは、Folio が受信した HTTP リクエストをルーティングする際にページをスキャンするディレクトリを登録し、uri メソッドはそのページの「ベース URI」を指定します:

  1. use Laravel\Folio\Folio;
  2. Folio::path(resource_path('views/pages/guest'))->uri('/');
  3. Folio::path(resource_path('views/pages/admin'))
  4. ->uri('/admin')
  5. ->middleware([
  6. '*' => [
  7. 'auth',
  8. 'verified',
  9. // ...
  10. ],
  11. ]);

サブドメインルーティング

受信リクエストのサブドメインに基づいてページにルーティングすることもできます。たとえば、admin.example.com からのリクエストを Folio ページの残りとは異なるページディレクトリにルーティングしたい場合があります。これは、Folio::path メソッドを呼び出した後に domain メソッドを呼び出すことで実現できます:

  1. use Laravel\Folio\Folio;
  2. Folio::domain('admin.example.com')
  3. ->path(resource_path('views/pages/admin'));

domain メソッドは、ドメインまたはサブドメインの一部をパラメータとしてキャプチャすることもできます。これらのパラメータは、ページテンプレートに注入されます:

  1. use Laravel\Folio\Folio;
  2. Folio::domain('{account}.example.com')
  3. ->path(resource_path('views/pages/admin'));

ルートの作成

Folio ルートを作成するには、Folio マウントディレクトリのいずれかに Blade テンプレートを配置します。デフォルトでは、Folio は resources/views/pages ディレクトリをマウントしますが、Folio サービスプロバイダーの boot メソッドでこれらのディレクトリをカスタマイズできます。

Blade テンプレートが Folio マウントディレクトリに配置されると、すぐにブラウザでアクセスできます。たとえば、pages/schedule.blade.php に配置されたページは、http://example.com/schedule でブラウザからアクセスできます。

すべての Folio ページ / ルートのリストをすぐに表示するには、folio:list Artisan コマンドを呼び出します:

  1. php artisan folio:list

ネストされたルート

Folio のディレクトリの1つ内に1つ以上のディレクトリを作成することで、ネストされたルートを作成できます。たとえば、/user/profile 経由でアクセス可能なページを作成するには、pages/user ディレクトリ内に profile.blade.php テンプレートを作成します:

  1. php artisan folio:page user/profile
  2. # pages/user/profile.blade.php → /user/profile

インデックスルート

時には、特定のページをディレクトリの「インデックス」にしたい場合があります。Folio ディレクトリ内に index.blade.php テンプレートを配置することで、そのディレクトリのルートへのリクエストはすべてそのページにルーティングされます:

  1. php artisan folio:page index
  2. # pages/index.blade.php → /
  3. php artisan folio:page users/index
  4. # pages/users/index.blade.php → /users

ルートパラメータ

しばしば、受信リクエストの URL のセグメントをページに注入して、それらと対話する必要があります。たとえば、表示されているユーザーの「ID」にアクセスする必要があるかもしれません。これを実現するには、ページのファイル名のセグメントを角括弧で囲みます:

  1. php artisan folio:page "users/[id]"
  2. # pages/users/[id].blade.php → /users/1

キャプチャされたセグメントは、Blade テンプレート内で変数としてアクセスできます:

  1. <div>
  2. User {{ $id }}
  3. </div>

複数のセグメントをキャプチャするには、囲まれたセグメントの前に三つのドット ... を付けることができます:

  1. php artisan folio:page "users/[...ids]"
  2. # pages/users/[...ids].blade.php → /users/1/2/3

複数のセグメントをキャプチャする場合、キャプチャされたセグメントは配列としてページに注入されます:

  1. <ul>
  2. @foreach ($ids as $id)
  3. <li>User {{ $id }}</li>
  4. @endforeach
  5. </ul>

ルートモデルバインディング

ページテンプレートのファイル名のワイルドカードセグメントがアプリケーションの Eloquent モデルの1つに対応する場合、Folio は Laravel のルートモデルバインディング機能を自動的に利用し、解決されたモデルインスタンスをページに注入しようとします:

  1. php artisan folio:page "users/[User]"
  2. # pages/users/[User].blade.php → /users/1

キャプチャされたモデルは、Blade テンプレート内で変数としてアクセスできます。モデルの変数名は「キャメルケース」に変換されます:

  1. <div>
  2. User {{ $user->id }}
  3. </div>

キーのカスタマイズ

時には、id 以外のカラムを使用してバインドされた Eloquent モデルを解決したい場合があります。その場合、ページのファイル名にカラムを指定できます。たとえば、ファイル名が [Post:slug].blade.php のページは、id カラムの代わりに slug カラムを介してバインドされたモデルを解決しようとします。

Windows では、モデル名とキーを分けるために - を使用する必要があります: [Post-slug].blade.php

モデルの場所

デフォルトでは、Folio はアプリケーションの app/Models ディレクトリ内でモデルを検索します。ただし、必要に応じて、テンプレートのファイル名に完全修飾モデルクラス名を指定できます:

  1. php artisan folio:page "users/[.App.Models.User]"
  2. # pages/users/[.App.Models.User].blade.php → /users/1

ソフト削除されたモデル

デフォルトでは、ソフト削除されたモデルは暗黙のモデルバインディングを解決する際に取得されません。ただし、必要に応じて、ページのテンプレート内で withTrashed 関数を呼び出すことで、Folio にソフト削除されたモデルを取得するよう指示できます:

  1. <?php
  2. use function Laravel\Folio\{withTrashed};
  3. withTrashed();
  4. ?>
  5. <div>
  6. User {{ $user->id }}
  7. </div>

レンダーフック

デフォルトでは、Folio はページの Blade テンプレートの内容を受信リクエストに対する応答として返します。ただし、ページのテンプレート内で render 関数を呼び出すことで応答をカスタマイズできます。

render 関数はクロージャを受け入れ、Folio によってレンダリングされる View インスタンスを受け取ります。これにより、ビューに追加データを追加したり、応答全体をカスタマイズしたりできます。View インスタンスを受け取るだけでなく、追加のルートパラメータやモデルバインディングも render クロージャに提供されます:

  1. <?php
  2. use App\Models\Post;
  3. use Illuminate\Support\Facades\Auth;
  4. use Illuminate\View\View;
  5. use function Laravel\Folio\render;
  6. render(function (View $view, Post $post) {
  7. if (! Auth::user()->can('view', $post)) {
  8. return response('Unauthorized', 403);
  9. }
  10. return $view->with('photos', $post->author->photos);
  11. }); ?>
  12. <div>
  13. {{ $post->content }}
  14. </div>
  15. <div>
  16. This author has also taken {{ count($photos) }} photos.
  17. </div>

名前付きルート

特定のページのルートに名前を指定するには、name 関数を使用します:

  1. <?php
  2. use function Laravel\Folio\name;
  3. name('users.index');

Laravel の名前付きルートと同様に、route 関数を使用して名前が付けられた Folio ページへの URL を生成できます:

  1. <a href="{{ route('users.index') }}">
  2. All Users
  3. </a>

ページにパラメータがある場合は、route 関数にその値を渡すだけです:

  1. route('users.show', ['user' => $user]);

ミドルウェア

ページのテンプレート内で middleware 関数を呼び出すことで、特定のページにミドルウェアを適用できます:

  1. <?php
  2. use function Laravel\Folio\{middleware};
  3. middleware(['auth', 'verified']);
  4. ?>
  5. <div>
  6. Dashboard
  7. </div>

また、Folio::path メソッドを呼び出した後に middleware メソッドをチェーンすることで、ページのグループにミドルウェアを割り当てることができます。

ミドルウェアを適用するページを指定するには、ミドルウェアの配列をそれらが適用されるページの対応する URL パターンを使用してキー付けできます。* 文字はワイルドカード文字として利用できます:

  1. use Laravel\Folio\Folio;
  2. Folio::path(resource_path('views/pages'))->middleware([
  3. 'admin/*' => [
  4. 'auth',
  5. 'verified',
  6. // ...
  7. ],
  8. ]);

配列内にクロージャを含めて、インラインの匿名ミドルウェアを定義できます:

  1. use Closure;
  2. use Illuminate\Http\Request;
  3. use Laravel\Folio\Folio;
  4. Folio::path(resource_path('views/pages'))->middleware([
  5. 'admin/*' => [
  6. 'auth',
  7. 'verified',
  8. function (Request $request, Closure $next) {
  9. // ...
  10. return $next($request);
  11. },
  12. ],
  13. ]);

ルートキャッシング

Folio を使用する際は、常に Laravel のルートキャッシング機能を活用するべきです。Folio は route:cache Artisan コマンドをリッスンして、Folio ページの定義とルート名が最大のパフォーマンスのために適切にキャッシュされることを確認します。