跳轉至內容

Laravel Folio

簡介

Laravel Folio 是一個功能強大的基於頁面的路由器,旨在簡化 Laravel 應用程式中的路由。使用 Laravel Folio,生成路由就像在應用程式的 resources/views/pages 目錄中建立 Blade 模板一樣簡單。

例如,要建立一個可以透過 /greeting URL 訪問的頁面,只需在應用程式的 resources/views/pages 目錄中建立一個 greeting.blade.php 檔案即可。

1<div>
2 Hello World
3</div>

安裝

要開始使用,請使用 Composer 包管理器將 Folio 安裝到您的專案中:

1composer require laravel/folio

安裝 Folio 後,您可以執行 folio:install Artisan 命令,它會將 Folio 的服務提供者安裝到您的應用程式中。該服務提供者會註冊 Folio 搜尋路由/頁面的目錄。

1php artisan folio:install

頁面路徑 / URI

預設情況下,Folio 從應用程式的 resources/views/pages 目錄提供頁面,但您可以在 Folio 服務提供者的 boot 方法中自定義這些目錄。

例如,有時在同一個 Laravel 應用程式中指定多個 Folio 路徑可能很方便。您可能希望為應用程式的“管理”區域設定一個單獨的 Folio 頁面目錄,同時為應用程式的其他頁面使用另一個目錄。

您可以使用 Folio::pathFolio::uri 方法來實現這一點。path 方法註冊一個 Folio 在路由傳入 HTTP 請求時掃描頁面的目錄,而 uri 方法為該頁面目錄指定“基礎 URI”。

1use Laravel\Folio\Folio;
2 
3Folio::path(resource_path('views/pages/guest'))->uri('/');
4 
5Folio::path(resource_path('views/pages/admin'))
6 ->uri('/admin')
7 ->middleware([
8 '*' => [
9 'auth',
10 'verified',
11 
12 // ...
13 ],
14 ]);

子域名路由

您還可以根據傳入請求的子域名路由到頁面。例如,您可能希望將來自 admin.example.com 的請求路由到與其餘 Folio 頁面不同的頁面目錄。您可以透過在呼叫 Folio::path 方法後呼叫 domain 方法來實現這一點。

1use Laravel\Folio\Folio;
2 
3Folio::domain('admin.example.com')
4 ->path(resource_path('views/pages/admin'));

domain 方法還允許您將域名或子域名的部分內容捕獲為引數。這些引數將被注入到您的頁面模板中。

1use Laravel\Folio\Folio;
2 
3Folio::domain('{account}.example.com')
4 ->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 命令。

1php artisan folio:list

巢狀路由

您可以透過在 Folio 目錄之一內建立一個或多個目錄來建立巢狀路由。例如,要建立一個可以透過 /user/profile 訪問的頁面,請在 pages/user 目錄內建立 profile.blade.php 模板。

1php artisan folio:page user/profile
2 
3# pages/user/profile.blade.php → /user/profile

索引路由

有時,您可能希望將某個給定頁面作為目錄的“索引”。透過在 Folio 目錄中放置 index.blade.php 模板,任何對該目錄根目錄的請求都將路由到該頁面。

1php artisan folio:page index
2# pages/index.blade.php → /
3 
4php artisan folio:page users/index
5# pages/users/index.blade.php → /users

路由引數

通常,您需要將傳入請求 URL 的片段注入到您的頁面中,以便進行互動。例如,您可能需要訪問正在顯示的使用者的“ID”。為此,您可以將頁面檔名的某個片段用方括號括起來。

1php artisan folio:page "users/[id]"
2 
3# pages/users/[id].blade.php → /users/1

捕獲的片段可以在 Blade 模板中作為變數訪問。

1<div>
2 User {{ $id }}
3</div>

要捕獲多個片段,可以在封裝的片段前加上三個點 ...

1php artisan folio:page "users/[...ids]"
2 
3# pages/users/[...ids].blade.php → /users/1/2/3

當捕獲多個片段時,這些片段將作為陣列注入到頁面中。

1<ul>
2 @foreach ($ids as $id)
3 <li>User {{ $id }}</li>
4 @endforeach
5</ul>

路由模型繫結

如果頁面模板檔名的萬用字元片段對應於應用程式中的某個 Eloquent 模型,Folio 將自動利用 Laravel 的路由模型繫結功能,並嘗試將解析出的模型例項注入到您的頁面中。

1php artisan folio:page "users/[User]"
2 
3# pages/users/[User].blade.php → /users/1

捕獲的模型可以在 Blade 模板中作為變數訪問。模型變數名將轉換為“駝峰命名法”。

1<div>
2 User {{ $user->id }}
3</div>

自定義鍵

有時您可能希望使用除 id 以外的列來解析繫結的 Eloquent 模型。為此,您可以在頁面檔名中指定該列。例如,檔名為 [Post:slug].blade.php 的頁面將嘗試透過 slug 列而不是 id 列解析繫結的模型。

在 Windows 上,您應該使用 - 來分隔模型名稱和鍵:[Post-slug].blade.php

模型位置

預設情況下,Folio 會在應用程式的 app/Models 目錄中搜索您的模型。但是,如果需要,您可以在模板檔名中指定完全限定的模型類名。

1php artisan folio:page "users/[.App.Models.User]"
2 
3# pages/users/[.App.Models.User].blade.php → /users/1

軟刪除模型

預設情況下,在解析隱式模型繫結時,不會檢索已軟刪除的模型。但是,如果您願意,可以透過在頁面模板中呼叫 withTrashed 函式來指示 Folio 檢索軟刪除的模型。

1<?php
2 
3use function Laravel\Folio\{withTrashed};
4 
5withTrashed();
6 
7?>
8 
9<div>
10 User {{ $user->id }}
11</div>

渲染鉤子

預設情況下,Folio 會返回頁面 Blade 模板的內容作為對傳入請求的響應。但是,您可以透過在頁面模板中呼叫 render 函式來自定義響應。

render 函式接受一個閉包,該閉包將接收 Folio 正在渲染的 View 例項,允許您向檢視新增額外資料或自定義整個響應。除了接收 View 例項外,任何額外的路由引數或模型繫結也會提供給 render 閉包。

1<?php
2 
3use App\Models\Post;
4use Illuminate\Support\Facades\Auth;
5use Illuminate\View\View;
6 
7use function Laravel\Folio\render;
8 
9render(function (View $view, Post $post) {
10 if (! Auth::user()->can('view', $post)) {
11 return response('Unauthorized', 403);
12 }
13 
14 return $view->with('photos', $post->author->photos);
15}); ?>
16 
17<div>
18 {{ $post->content }}
19</div>
20 
21<div>
22 This author has also taken {{ count($photos) }} photos.
23</div>

命名路由

您可以使用 name 函式為給定頁面的路由指定名稱。

1<?php
2 
3use function Laravel\Folio\name;
4 
5name('users.index');

就像 Laravel 的命名路由一樣,您可以使用 route 函式來生成指向已命名 Folio 頁面的 URL。

1<a href="{{ route('users.index') }}">
2 All Users
3</a>

如果頁面有引數,只需將它們的值傳遞給 route 函式即可。

1route('users.show', ['user' => $user]);

中介軟體

您可以透過在頁面模板中呼叫 middleware 函式來將中介軟體應用於特定頁面。

1<?php
2 
3use function Laravel\Folio\{middleware};
4 
5middleware(['auth', 'verified']);
6 
7?>
8 
9<div>
10 Dashboard
11</div>

或者,要將中介軟體分配給一組頁面,您可以在呼叫 Folio::path 方法後鏈式呼叫 middleware 方法。

要指定中介軟體應應用於哪些頁面,中介軟體陣列可以使用它們應應用的相應 URL 模式作為鍵。* 字元可用作萬用字元。

1use Laravel\Folio\Folio;
2 
3Folio::path(resource_path('views/pages'))->middleware([
4 'admin/*' => [
5 'auth',
6 'verified',
7 
8 // ...
9 ],
10]);

您可以在中介軟體陣列中包含閉包,以定義內聯的匿名中介軟體。

1use Closure;
2use Illuminate\Http\Request;
3use Laravel\Folio\Folio;
4 
5Folio::path(resource_path('views/pages'))->middleware([
6 'admin/*' => [
7 'auth',
8 'verified',
9 
10 function (Request $request, Closure $next) {
11 // ...
12 
13 return $next($request);
14 },
15 ],
16]);

路由快取

使用 Folio 時,請務必利用 Laravel 的路由快取功能。Folio 會監聽 route:cache Artisan 命令,以確保 Folio 頁面定義和路由名稱被正確快取,從而獲得最佳效能。