Laravel Folio
Table of Contents
Introduction
Laravel Folio は、 Laravel アプリケーションでの routing を簡素化するために設計された強力なページベースのルーターです。 Laravel Folio を使えば、アプリケーションのresources/views/pages
ディレクトリ内で Blade テンプレートを作成するのと同じくらい簡単に route を生成できます。
例えば、/greeting
URL でアクセス可能なページを作成するには、アプリケーションのresources/views/pages
ディレクトリにgreeting.blade.php
ファイルを作成するだけです:
<div>
Hello World
</div>
Installation
始めるには、 Composer パッケージマネージャーを使用して、Folio をあなたの project にインストールしてください:
composer require laravel/folio
Folio をインストールした後、folio:install
Artisan command を実行することができます。これにより、Folio の service provider があなたの application にインストールされます。この service provider は、Folio が routes / pages を search するディレクトリを登録します。
php artisan folio:install
ページパス / URIs
default では、Folio はあなたの application の resources/views/pages
ディレクトリからページを提供しますが、Folio の service プロバイダの boot
method で、これらのディレクトリをカスタマイズすることができます。
例えば、時には同じ Laravel application で複数の Folio パスを指定すると便利なことがあります。あなたのアプリケーションの "admin" エリアには別の Folio ページのディレクトリを使用したい場合や、アプリケーションの残りのページには別のディレクトリを使用したい場合などです。
この作業は、Folio::path
およびFolio::uri
メソッドを使用して達成することができます。path
method は、routing HTTP requests の際に Folio がページをスキャンするディレクトリを登録し、uri
method はそのページディレクトリのベース 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',
// ...
],
]);
サブドメイン Routing
あなたはまた、受信リクエストのサブドメインに基づいてページに route することもできます。例えば、admin.example.com
からのリクエストを、あなたの Folio の他のページとは異なるページディレクトリに route したい場合があるかもしれません。これは、Folio::path
method を呼び出した後に、domain
method を呼び出すことで実現できます。
use Laravel\Folio\Folio;
Folio::domain('admin.example.com')
->path(resource_path('views/pages/admin'));
domain
method は、 domain やサブドメインの部分をパラメータとして取得することも可能です。これらのパラメータはページテンプレートに注入されます:
use Laravel\Folio\Folio;
Folio::domain('{account}.example.com')
->path(resource_path('views/pages/admin'));
Creating Routes
あなたは、Folio マウントディレクトリのいずれかに Blade テンプレートを配置することにより、Folio の route を作成することができます。 default として、Folio は resources/views/pages
ディレクトリをマウントしますが、Folio の service プロバイダの boot
method でこれらのディレクトリをカスタマイズすることもできます。
Blade テンプレートが Folio にマウントされたディレクトリに配置されると、すぐにブラウザからアクセスすることができます。例えば、pages/schedule.blade.php
に配置されたページは、ブラウザでhttp://example.com/schedule
にアクセスすることで閲覧することができます。
すべての Folio ページ/ routes のリストをすばやく view するには、folio:list
の Artisan command を呼び出すことができます:
php artisan folio:list
ネストされた Routes
Folio のディレクトリの中に 1 つ以上のディレクトリを作成することで、ネストされた route を作成することができます。たとえば、/user/profile
経由でアクセス可能なページを作成するには、pages/user
ディレクトリ内にprofile.blade.php
テンプレートを作成します。
php artisan folio:page user/profile
# pages/user/profile.blade.php → /user/profile
インデックス Routes
時々、特定のページをディレクトリの"インデックス"にしたい場合があります。Folio ディレクトリ内にindex.blade.php
テンプレートを配置することで、そのディレクトリの root へのリクエストはそのページにルーティングされます。
php artisan folio:page index
# pages/index.blade.php → /
php artisan folio:page users/index
# pages/users/index.blade.php → /users
Route Parameters
よく、受信リクエストの URL のセグメントをページに挿入して、それらと対話できるようにする必要があります。例えば、表示されている user の"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
複数のセグメントをキャプチャすると、キャプチャしたセグメントは array としてページに挿入されます:
<ul>
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
</ul>
Route Model Binding
あなたのページテンプレートのファイル名のワイルドカードセグメントがあなたのアプリケーションの Eloquent models のいずれかに対応している場合、Folio は自動的に Laravel の route model binding 機能を活用し、解決された model インスタンスをあなたのページに attempt で注入します:
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php → /users/1
キャプチャした models は、 Blade テンプレート内の変数としてアクセスすることができます。モデルの変数名は"camel case"に変換されます。
<div>User {{ $user->id }}</div>
キーのカスタマイズ
時には、id
以外の column を使用してバウンドされた Eloquent models を解決したい場合があるかもしれません。そのような場合、ページのファイル名で column を指定することができます。たとえば、ファイル名が [Post:slug].blade.php
のページは、id
の column ではなく、slug
の column を介してバウンドされた model の解決を attempt 。
Windows では、-
を使用して model の名前とキーを分ける必要があります:[Post-slug].blade.php
。
Model の場所
default として、Folio はあなたの application のapp/Models
ディレクトリ内であなたの model を検索します。しかし、必要であれば、テンプレートのファイル名で完全修飾 model class 名を指定することができます。
php artisan folio:page "users/[.App.Models.User]"
# pages/users/[.App.Models.User].blade.php → /users/1
ソフト削除された Models
default では、ソフト削除された models は、暗黙の models バインディングを解決するときには取得されません。ただし、必要に応じて、ページのテンプレート内でwithTrashed
関数を呼び出すことで、Folio にソフト削除された models を取得するよう指示することができます。
<?php
use function Laravel\Folio\{withTrashed};
withTrashed();
?>
<div>
User {{ $user->id }}
</div>
Render Hooks
default では、Folio はページの Blade テンプレートの content を、着信する request への response として返します。しかし、ページのテンプレート内でrender
関数を呼び出すことで、 response をカスタマイズすることもできます。
render
関数はクロージャを受け入れます。これは Folio によって描画されるView
インスタンスを受け取り、追加の data を view に追加したり、全体の response をカスタマイズしたりすることができます。 View
インスタンスを受け取るだけでなく、 追加の route パラメータや model バインディングも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>
Named Routes
指定したページの route に名前を付けるために、name
関数を使用することができます:
<?php
use function Laravel\Folio\name;
name('users.index');
Laravel の名前付き routes のように、route
関数を使用して名前が付けられた Folio ページへの URL を生成することができます。
<a href="{{ route('users.index') }}">
All Users
</a>
ページにパラメータがある場合、その values を route
関数に簡単に渡すことができます:
route('users.show', ['user' => $user]);
Middleware
middleware
関数をページのテンプレート内で呼び出すことにより、特定のページに対して middleware を適用することができます。
<?php
use function Laravel\Folio\{middleware};
middleware(['auth', 'verified']);
?>
<div>
Dashboard
</div>
または、一連のページに middleware を割り当てるためには、Folio::path
の method を呼び出した後で、middleware
の method を連鎖的に使用することができます。
middleware を適用すべきページを指定するために、 middleware の array はそれらが適用されるべきページの対応する URL パターンを使用してキー化することができます。 *
文字はワイルドカード文字として利用することができます:
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
// ...
],
]);
あなたは、インラインで匿名の middleware を定義するために、array の中にクロージャを含めることができます。
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);
},
],
]);
Route Caching
Folio を使用するときは常に、Laravel の route caching 能力を活用するべきです。Folio は route:cache
の Artisan command に対してリッスンし、Folio ページの定義と route の名前が最大性能を発揮するために適切にキャッシュされることを確認します。