Laravel Folio¶
はじめに¶
Laravel Folio は、Laravelアプリケーションのルーティングを簡素化するために設計された強力なページベースのルーターです。Laravel Folioを使用すると、ルートを生成することは、アプリケーションの resources/views/pages
ディレクトリ内にBladeテンプレートを作成するのと同じくらい簡単になります。
例えば、/greeting
URLでアクセス可能なページを作成するには、アプリケーションの resources/views/pages
ディレクトリに greeting.blade.php
ファイルを作成するだけです:
インストール¶
まず、Composerパッケージマネージャを使用してFolioをプロジェクトにインストールします:
Folioをインストールした後、folio:install
Artisanコマンドを実行することができます。これにより、Folioのサービスプロバイダがアプリケーションにインストールされます。このサービスプロバイダは、Folioがルート/ページを検索するディレクトリを登録します:
ページパス / URI¶
デフォルトでは、Folioはアプリケーションの resources/views/pages
ディレクトリからページを提供しますが、Folioサービスプロバイダの boot
メソッドでこれらのディレクトリをカスタマイズすることができます。
例えば、同じLaravelアプリケーション内で複数の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コマンドを呼び出すことができます:
ネストされたルート¶
Folioのディレクトリ内に1つ以上のディレクトリを作成することで、ネストされたルートを作成できます。例えば、/user/profile
でアクセス可能なページを作成するには、pages/user
ディレクトリ内に profile.blade.php
テンプレートを作成します:
インデックスルート¶
場合によっては、特定のページをディレクトリの「インデックス」にすることがあります。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」にアクセスする必要がある場合があります。これを実現するには、ページのファイル名のセグメントを角括弧で囲みます:
キャプチャされたセグメントは、Bladeテンプレート内で変数としてアクセスできます:
複数のセグメントをキャプチャするには、セグメントを囲むセグメントに3つのドット ...
を付けることができます:
複数のセグメントをキャプチャする場合、キャプチャされたセグメントはページに配列として注入されます:
ルートモデルバインディング¶
ページテンプレートのファイル名のワイルドカードセグメントがアプリケーションのEloquentモデルの1つに対応する場合、Folioは自動的にLaravelのルートモデルバインディング機能を利用し、解決されたモデルインスタンスをページに注入しようとします:
キャプチャされたモデルは、Bladeテンプレート内で変数としてアクセスできます。モデルの変数名は「キャメルケース」に変換されます:
キーのカスタマイズ¶
場合によっては、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に指示できます:
レンダーフック¶
デフォルトでは、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
関数を使用して、特定のページのルートに名前を指定できます:
Laravelの名前付きルートと同様に、route
関数を使用して、名前が割り当てられたFolioページのURLを生成できます:
ページにパラメータがある場合、それらの値を route
関数に渡すだけです:
ミドルウェア¶
ページのテンプレート内で 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',
// ...
],
]);
```php
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);
},
],
]);
配列のミドルウェアにクロージャを含めて、インラインの匿名ミドルウェアを定義することもできます。
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のページ定義とルート名が適切にキャッシュされ、最大のパフォーマンスを確保します。