#はじめに
Laravel Folio は、Laravelアプリケーションのルーティングを簡素化するために設計された強力なページベースのルーターです。Laravel Folio を使うと、ルートの生成はアプリケーションの resources/views/pages ディレクトリ内に Blade テンプレートを作成するだけで簡単にできます。
例えば、/greeting URL でアクセス可能なページを作成するには、アプリケーションの resources/views/pages ディレクトリに greeting.blade.php ファイルを作成するだけです:
<div>
Hello World
</div>
#インストール
はじめるには、Composer パッケージマネージャーを使って Folio をプロジェクトにインストールしてください:
composer require laravel/folio
Folio をインストールした後、folio:install Artisan コマンドを実行すると、Folio のサービスプロバイダーがアプリケーションにインストールされます。このサービスプロバイダーは、Folio がルート/ページを検索するディレクトリを登録します:
php artisan folio:install
#ページパス / URI
デフォルトでは、Folio はアプリケーションの resources/views/pages ディレクトリからページを提供しますが、Folio のサービスプロバイダーの boot メソッドでこれらのディレクトリをカスタマイズできます。
例えば、同じ Laravel アプリケーション内で複数の Folio パスを指定したい場合があります。アプリケーションの「管理」エリア用に別の Folio ページディレクトリを用意し、他のページは別のディレクトリで管理したいことがあります。
これは Folio::path と Folio::uri メソッドを使って実現できます。path メソッドは Folio が HTTP リクエストのルーティング時にページをスキャンするディレクトリを登録し、uri メソッドはそのページディレクトリの「ベースURI」を指定します:
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages/guest'))->uri('/');
Folio::path(resource_path('views/pages/admin'))
->uri('/admin')
->middleware([
'*' => [
'auth',
'verified',
// ...
],
]);
#サブドメインルーティング
リクエストのサブドメインに基づいてページへルーティングすることもできます。例えば、admin.example.com からのリクエストを他の Folio ページとは異なるページディレクトリにルーティングしたい場合があります。これは Folio::path メソッドの後に domain メソッドを呼び出すことで実現できます:
use Laravel\Folio\Folio;
Folio::domain('admin.example.com')
->path(resource_path('views/pages/admin'));
domain メソッドは、ドメインやサブドメインの一部をパラメータとしてキャプチャすることも可能です。これらのパラメータはページテンプレートに注入されます:
use Laravel\Folio\Folio;
Folio::domain('{account}.example.com')
->path(resource_path('views/pages/admin'));
#ルートの作成
Folio のマウントされたディレクトリに Blade テンプレートを配置することで、Folio ルートを作成できます。デフォルトでは Folio は resources/views/pages ディレクトリをマウントしますが、Folio のサービスプロバイダーの boot メソッドでカスタマイズ可能です。
Blade テンプレートを Folio のマウントされたディレクトリに置くと、すぐにブラウザからアクセスできます。例えば、pages/schedule.blade.php に置いたページは http://example.com/schedule でアクセス可能です。
すべての Folio ページ/ルートの一覧を素早く確認したい場合は、folio:list Artisan コマンドを実行してください:
php artisan folio:list
#ネストしたルート
Folio のディレクトリ内に1つ以上のディレクトリを作成することで、ネストしたルートを作成できます。例えば、/user/profile でアクセス可能なページを作成するには、pages/user ディレクトリ内に profile.blade.php テンプレートを作成します:
php artisan make:folio user/profile
# pages/user/profile.blade.php → /user/profile
#インデックスルート
特定のページをディレクトリの「インデックス」にしたい場合があります。Folio ディレクトリ内に index.blade.php テンプレートを置くと、そのディレクトリのルートへのリクエストはそのページにルーティングされます:
php artisan make:folio index
# pages/index.blade.php → /
php artisan make:folio users/index
# pages/users/index.blade.php → /users
#ルートパラメータ
リクエストの URL の一部をページに注入して操作したいことがよくあります。例えば、表示しているユーザーの「ID」にアクセスしたい場合です。これを実現するには、ページのファイル名の一部を角括弧で囲みます:
php artisan make:folio "users/[id]"
# pages/users/[id].blade.php → /users/1
キャプチャされたセグメントは Blade テンプレート内で変数としてアクセスできます:
<div>
User {{ $id }}
</div>
複数のセグメントをキャプチャするには、角括弧内のセグメントの前に三点リーダー ... を付けます:
php artisan make:folio "users/[...ids]"
# pages/users/[...ids].blade.php → /users/1/2/3
複数のセグメントをキャプチャすると、キャプチャされたセグメントは配列としてページに注入されます:
<ul>
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
</ul>
#ルートモデルバインディング
ページテンプレートのワイルドカードセグメントがアプリケーションの Eloquent モデルに対応している場合、Folio は Laravel のルートモデルバインディング機能を自動的に利用し、解決されたモデルインスタンスをページに注入します:
php artisan make:folio "users/[User]"
# pages/users/[User].blade.php → /users/1
キャプチャされたモデルは Blade テンプレート内で変数としてアクセスできます。モデルの変数名はキャメルケースに変換されます:
<div>
User {{ $user->id }}
</div>
#キーのカスタマイズ
バインドされた Eloquent モデルを id 以外のカラムで解決したい場合があります。その場合はページのファイル名でカラムを指定できます。例えば、ファイル名が [Post:slug].blade.php のページは、id ではなく slug カラムでモデルを解決しようとします。
Windows では、モデル名とキーの区切りに - を使う必要があります:[Post-slug].blade.php。
#モデルの場所
デフォルトでは、Folio はアプリケーションの app/Models ディレクトリ内でモデルを検索します。ただし、必要に応じてテンプレートのファイル名に完全修飾モデルクラス名を指定できます:
php artisan make:folio "users/[.App.Models.User]"
# pages/users/[.App.Models.User].blade.php → /users/1
#ソフトデリートされたモデル
デフォルトでは、ソフトデリートされたモデルは暗黙的なモデルバインディングの解決時に取得されません。ただし、必要に応じてページテンプレート内で withTrashed 関数を呼び出すことで、ソフトデリートされたモデルを取得するよう Folio に指示できます:
<?php
use function Laravel\Folio\{withTrashed};
withTrashed();
?>
<div>
User {{ $user->id }}
</div>
#レンダーフック
デフォルトでは、Folio はページの Blade テンプレートの内容をリクエストへのレスポンスとして返します。ただし、ページテンプレート内で render 関数を呼び出すことでレスポンスをカスタマイズできます。
render 関数はクロージャを受け取り、そのクロージャは Folio がレンダリングする View インスタンスを受け取ります。これにより、ビューに追加データを渡したりレスポンス全体をカスタマイズできます。View インスタンスに加え、追加のルートパラメータやモデルバインディングも render クロージャに渡されます:
<?php
use App\Models\Post;
use Illuminate\Support\Facades\Auth;
use Illuminate\View\View;
use function Laravel\Folio\render;
render(function (View $view, Post $post) {
if (! Auth::user()->can('view', $post)) {
return response('Unauthorized', 403);
}
return $view->with('photos', $post->author->photos);
}); ?>
<div>
{{ $post->content }}
</div>
<div>
This author has also taken {{ count($photos) }} photos.
</div>
#名前付きルート
ページのルートに名前を付けるには name 関数を使います:
<?php
use function Laravel\Folio\name;
name('users.index');
Laravel の名前付きルートと同様に、名前が付けられた Folio ページの URL を生成するには route 関数を使えます:
<a href="{{ route('users.index') }}">
All Users
</a>
ページにパラメータがある場合は、その値を route 関数に渡すだけです:
route('users.show', ['user' => $user]);
#ミドルウェア
特定のページにミドルウェアを適用するには、ページテンプレート内で middleware 関数を呼び出します:
<?php
use function Laravel\Folio\{middleware};
middleware(['auth', 'verified']);
?>
<div>
Dashboard
</div>
または、複数のページにミドルウェアを割り当てるには、Folio::path メソッドの後に middleware メソッドをチェーンできます。
ミドルウェアを適用するページを指定するには、ミドルウェアの配列のキーに適用対象のページの URL パターンを指定します。* 文字はワイルドカードとして使えます:
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
// ...
],
]);
ミドルウェアの配列にクロージャを含めて、インラインの匿名ミドルウェアを定義できます:
use Closure;
use Illuminate\Http\Request;
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
function (Request $request, Closure $next) {
// ...
return $next($request);
},
],
]);
#ルートキャッシュ
Folio を使う場合は、常に Laravel のルートキャッシュ機能 を活用してください。Folio は route:cache Artisan コマンドを監視し、Folio ページ定義とルート名が最大のパフォーマンスのために正しくキャッシュされるようにします。