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::path
和 Folio::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
软删除模型
默认情况下,在解析隐式模型绑定时,不会检索已软删除的模型。但是,如果需要,你可以通过在页面的模板中调用 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 页面定义和路由名称被正确缓存以获得最大性能。