Laravel 10.x Laravel Folio

イントロダクション

Laravel Folio(フォリオ)は、Laravelアプリケーションのルーティングを簡素化するために設計した、強力なページベースのルータです。Laravel Folioを使用すると、アプリケーションでresources/views/pagesディレクトリ内にBladeテンプレートを作成するのと同じくらい簡単にルートを生成できます。

例えば、/greeting URLでアクセスできるページを作成するには、アプリケーションのresources/views/pagesディレクトリにgreeting.blade.phpファイルを作成します。

<div>
    Hello World
</div>

インストール

Folioを利用開始するには、Composerパッケージマネージャを使い、プロジェクトにインストールします。

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メソッドは 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つ以上作成すれば、ネストしたルートを作成できます。例えば、/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>

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

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カラムを使い結合済みモデルを依存解決しようとします。

モデルの場所

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の名前付きルートと同様、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のページ定義とルート名が適切にキャッシュされ、パフォーマンスが最大になるようにします。

ドキュメント章別ページ

ヘッダー項目移動

注目:アイコン:ページ内リンク設置(リンクがないヘッダーへの移動では、リンクがある以前のヘッダーのハッシュをURLへ付加します。

移動

クリックで即時移動します。

設定

適用ボタンクリック後に、全項目まとめて適用されます。

カラーテーマ
和文指定 Pagination
和文指定 Scaffold
Largeスクリーン表示幅
インデント
本文フォント
コードフォント
フォント適用確認

フォントの指定フィールドから、フォーカスが外れると、当ブロックの内容に反映されます。EnglishのDisplayもPreviewしてください。

フォント設定時、表示に不具合が出た場合、当サイトのクッキーを削除してください。

バックスラッシュを含むインライン\Code\Blockの例です。

以下はコードブロックの例です。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * ユーザに関連する電話レコードを取得
     */
    public function phone()
    {
        return $this->hasOne('App\Phone');
    }
}

設定を保存する前に、表示が乱れないか必ず確認してください。CSSによるフォントファミリー指定の知識がない場合は、フォントを変更しないほうが良いでしょう。

キーボード・ショートカット

オープン操作

PDC

ページ(章)移動の左オフキャンバスオープン

HA

ヘッダー移動モーダルオープン

MS

移動/設定の右オフキャンバスオープン

ヘッダー移動

T

最初のヘッダーへ移動

E

最後のヘッダーへ移動

NJ

次ヘッダー(H2〜H4)へ移動

BK

前ヘッダー(H2〜H4)へ移動

その他

?

このヘルプページ表示
閉じる