Laravel Folio
- Introduction
- Installation
- Creating Routes
- Route Parameters
- Route Model Binding
- Render Hooks
- Named Routes
- Middleware
- Route Caching
介绍
Laravel Folio是一款功能强大的基于页面的路由器,旨在简化 Laravel 应用程序中的路由。使用 Laravel Folio,生成路由变得像在应用程序resources/views/pages
目录中创建 Blade 模板一样轻松。
例如,要创建可通过 URL 访问的页面,只需在应用程序的目录中/greeting
创建一个文件:greeting.blade.php
resources/views/pages
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 页面以外的其他页面目录。您可以通过domain
在调用该Folio::path
方法后调用该方法来实现此目的:
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
,请在目录中创建一个profile.blade.php
模板pages/user
:
1php artisan folio:page user/profile2 3# pages/user/profile.blade.php → /user/profile
索引路由
有时,您可能希望将给定页面设为目录的“索引”。通过将index.blade.php
模板放置在 Folio 目录中,任何对该目录根目录的请求都将被路由到该页面:
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>
自定义键
有时您可能希望使用 以外的列来解析绑定的 Eloquent 模型id
。为此,您可以在页面的文件名中指定该列。例如,文件名为 的页面将尝试通过列(而不是列)[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
函数接受一个闭包,该闭包将接收View
Folio 正在渲染的实例,允许您向视图添加其他数据或自定义整个响应。除了接收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>
或者,要将中间件分配给一组页面,您可以middleware
在调用该Folio::path
方法后链接该方法。
要指定中间件应应用于哪些页面,可以使用中间件应应用于的页面的相应 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 页面定义和路由名称得到正确缓存,从而实现最佳性能。