コンテンツにスキップ

Laravel Folio

はじめに

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` メソッドは、受信HTTPリクエストをルーティングするときにFolioがページをスキャンするディレクトリを登録し、 `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つに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>

複数のセグメントをキャプチャするには、カプセル化されたセグメントの前に3つのドット `...` を付けます。

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` インスタンスを受け取るクロージャを受け入れます。これにより、ビューに追加データを

<?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ページ定義とルート名が最大限のパフォーマンスを得られるよう適切にキャッシュされるようにします。