跳至內容

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::pathFolio::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'));

建立路由

您可以將 Blade 模板放置在任何已掛載的 Folio 目錄中來建立 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 的其中一個目錄中建立一個或多個目錄來建立巢狀路由。例如,若要建立一個可透過 /user/profile 存取的頁面,請在 pages/user 目錄中建立一個 profile.blade.php 模板

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

索引路由

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

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>

若要捕獲多個區段,您可以使用三個點 ... 作為封裝區段的前綴

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 模型,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 的頁面將嘗試透過 slug 欄位而不是 id 欄位來解析綁定的模型。

在 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

軟刪除模型

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

<?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 頁面定義和路由名稱已正確快取,以實現最大效能。