はじめに
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 パスを指定することが便利な場合があります。アプリケーションの「admin」エリア用に 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 ルートを作成するには、Folio マウントディレクトリのいずれかに Blade テンプレートを配置します。デフォルトでは、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つ内に1つ以上のディレクトリを作成することで、ネストされたルートを作成できます。たとえば、/user/profile
経由でアクセス可能なページを作成するには、pages/user
ディレクトリ内に profile.blade.php
テンプレートを作成します:
php artisan folio:page user/profile
# pages/user/profile.blade.php → /user/profile
インデックスルート
時には、特定のページをディレクトリの「インデックス」にしたい場合があります。Folio ディレクトリ内に index.blade.php
テンプレートを配置することで、そのディレクトリのルートへのリクエストはすべてそのページにルーティングされます:
php artisan folio:page index
# pages/index.blade.php → /
php artisan folio:page users/index
# pages/users/index.blade.php → /users
ルートパラメータ
しばしば、受信リクエストの URL のセグメントをページに注入して、それらと対話する必要があります。たとえば、表示されているユーザーの「ID」にアクセスする必要があるかもしれません。これを実現するには、ページのファイル名のセグメントを角括弧で囲みます:
php artisan folio:page "users/[id]"
# pages/users/[id].blade.php → /users/1
キャプチャされたセグメントは、Blade テンプレート内で変数としてアクセスできます:
<div>
User {{ $id }}
</div>
複数のセグメントをキャプチャするには、囲まれたセグメントの前に三つのドット ...
を付けることができます:
php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php → /users/1/2/3
複数のセグメントをキャプチャする場合、キャプチャされたセグメントは配列としてページに注入されます:
<ul>
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
</ul>
ルートモデルバインディング
ページテンプレートのファイル名のワイルドカードセグメントがアプリケーションの Eloquent モデルの1つに対応する場合、Folio は Laravel のルートモデルバインディング機能を自動的に利用し、解決されたモデルインスタンスをページに注入しようとします:
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php → /users/1
キャプチャされたモデルは、Blade テンプレート内で変数としてアクセスできます。モデルの変数名は「キャメルケース」に変換されます:
<div>
User {{ $user->id }}
</div>
キーのカスタマイズ
時には、id
以外のカラムを使用してバインドされた Eloquent モデルを解決したい場合があります。その場合、ページのファイル名にカラムを指定できます。たとえば、ファイル名が [Post:slug].blade.php
のページは、id
カラムの代わりに slug
カラムを介してバインドされたモデルを解決しようとします。
Windows では、モデル名とキーを分けるために -
を使用する必要があります: [Post-slug].blade.php
。
モデルの場所
デフォルトでは、Folio はアプリケーションの app/Models
ディレクトリ内でモデルを検索します。ただし、必要に応じて、テンプレートのファイル名に完全修飾モデルクラス名を指定できます:
php artisan folio:page "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 の名前付きルートと同様に、route
関数を使用して名前が付けられた Folio ページへの URL を生成できます:
<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 ページの定義とルート名が最大のパフォーマンスのために適切にキャッシュされることを確認します。