Laravel Folio
簡介
Laravel Folio 是一個強大的基於頁面的路由器,旨在簡化 Laravel 應用程式中的路由。使用 Laravel Folio,產生路由就像在應用程式的 resources/views/pages
目錄中建立 Blade 模板一樣輕鬆。
例如,要建立一個可透過 /greeting
URL 訪問的頁面,只需在應用程式的 resources/views/pages
目錄中建立一個 greeting.blade.php
檔案
1<div>2 Hello World3</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::path
和 Folio::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'));
建立路由
您可以透過將 Blade 模板放置在任何已掛載的 Folio 目錄中來建立 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/profile2 3# pages/user/profile.blade.php → /user/profile
索引路由
有時,您可能希望將給定的頁面設為目錄的「索引」。透過在 Folio 目錄中放置 index.blade.php
模板,對該目錄根目錄的任何請求都將路由到該頁面
1php artisan folio:page index2# pages/index.blade.php → /3 4php artisan folio:page users/index5# 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 @endforeach5</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
軟刪除模型
預設情況下,解析隱式模型綁定時不會檢索已軟刪除的模型。但是,如果您願意,您可以指示 Folio 透過在頁面模板中調用 withTrashed
函數來檢索軟刪除的模型
1<?php 2 3use function Laravel\Folio\{withTrashed}; 4 5withTrashed(); 6 7?> 8 9<div>10 User {{ $user->id }}11</div>
Render Hooks
預設情況下,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<?php2 3use function Laravel\Folio\name;4 5name('users.index');
就像 Laravel 的命名路由一樣,您可以使用 route
函數為已分配名稱的 Folio 頁面生成 URL
1<a href="{{ route('users.index') }}">2 All Users3</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 Dashboard11</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 頁面定義和路由名稱已正確快取,以獲得最佳效能。