Appearance
Laravel Folio
简介
Laravel Folio 是一个强大的基于页面的路由器,旨在简化 Laravel 应用程序中的路由。使用 Laravel Folio,生成路由变得像在应用程序的 resources/views/pages
目录中创建 Blade 模板一样简单。
例如,要创建一个可在 /greeting
URL 访问的页面,只需在应用程序的 resources/views/pages
目录中创建一个 greeting.blade.php
文件:
php
<div>
Hello World
</div>
安装
要开始使用 Folio,请使用 Composer 包管理器安装 Folio:
bash
composer require laravel/folio
安装 Folio 后,您可以执行 folio:install
Artisan 命令,该命令将安装 Folio 的服务提供商到您的应用程序中。该服务提供商注册了 Folio 将用于路由的目录:
bash
php artisan folio:install
页面路径 / URI
默认情况下,Folio 从您的应用程序的 resources/views/pages
目录中服务页面,但您可以在 Folio 服务提供商的 boot
方法中自定义这些目录。
例如,有时可能会方便地指定多个 Folio 路径在同一个 Laravel 应用程序中。您可能希望为应用程序的 "管理员" 区域指定一个单独的 Folio 页面目录,而使用另一个目录为应用程序的其他页面。
您可以使用 Folio::path
和 Folio::uri
方法实现此功能。 path
方法注册了 Folio 将用于路由的目录,而 uri
方法指定了该目录的 "基本 URI":
php
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages/guest'))->uri('/');
Folio::path(resource_path('views/pages/admin'))
->uri('/admin')
->middleware([
'*' => [
'auth',
'verified',
// ...
],
]);
子域名路由
您还可以基于 incoming 请求的子域名路由到页面。例如,您可能希望将来自 admin.example.com
的请求路由到一个不同的页面目录,而不是应用程序的其他 Folio 页面。您可以通过在 Folio::path
方法之后调用 domain
方法实现此功能:
php
use Laravel\Folio\Folio;
Folio::domain('admin.example.com')
->path(resource_path('views/pages/admin'));
domain
方法还允许您捕获域名或子域名的部分作为参数。这些参数将被注入到您的页面模板中:
php
use Laravel\Folio\Folio;
Folio::domain('{account}.example.com')
->path(resource_path('views/pages/admin'));
创建路由
您可以通过在 Folio 挂载的任何目录中放置 Blade 模板来创建 Folio 路由。默认情况下,Folio 挂载了 resources/views/pages
目录,但您可以在 Folio 服务提供商的 boot
方法中自定义这些目录。
一旦在 Folio 挂载的目录中放置了 Blade 模板,您就可以立即通过浏览器访问它。例如,在 pages/schedule.blade.php
中放置的页面可以通过 http://example.com/schedule
访问。
要快速查看应用程序中所有 Folio 页面 / 路由的列表,您可以执行 folio:list
Artisan 命令:
bash
php artisan folio:list
嵌套路由
您可以通过在 Folio 挂载的目录中创建一个或多个子目录来创建嵌套路由。例如,要创建一个可通过 /user/profile
访问的页面,只需在 pages/user
目录中创建一个 profile.blade.php
模板:
bash
php artisan folio:page user/profile
# pages/user/profile.blade.php → /user/profile
索引路由
有时,您可能希望将一个给定页面设置为目录的 "索引"。通过在 Folio 挂载的目录中放置一个 index.blade.php
模板,任何请求到该目录的根路径都会被路由到该页面:
bash
php artisan folio:page index
# pages/index.blade.php → /
php artisan folio:page users/index
# pages/users/index.blade.php → /users
路由参数
经常,您需要将 incoming 请求的 URL 中的某些部分注入到您的页面中,以便您可以与它们进行交互。例如,您可能需要访问正在显示的用户的 "ID"。要实现此功能,您可以将页面模板的文件名中的某个部分用方括号括起来:
bash
php artisan folio:page "users/[id]"
# pages/users/[id].blade.php → /users/1
捕获的部分可以在您的 Blade 模板中作为变量访问:
html
<div>
User {{ $id }}
</div>
要捕获多个部分,您可以在方括号前面添加三个点 ...
:
bash
php artisan folio:page "users/[...ids]"
# pages/users/[...ids].blade.php → /users/1/2/3
捕获多个部分时,捕获的部分将被注入到页面中作为一个数组:
html
<ul>
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
</ul>
路由模型绑定
如果页面模板文件名中的某个部分与您的应用程序中的 Eloquent 模型相对应,Folio 将自动利用 Laravel 的路由模型绑定功能,并尝试将解析的模型实例注入到您的页面中:
bash
php artisan folio:page "users/[User]"
# pages/users/[User].blade.php → /users/1
捕获的模型可以在您的 Blade 模板中作为变量访问。模型的变量名称将被转换为 "驼峰式":
html
<div>
User {{ $user->id }}
</div>
自定义键
有时,您可能希望使用其他列来解析绑定的 Eloquent 模型。要实现此功能,您可以在页面模板文件名中指定列名。例如,一个名为 [Post:slug].blade.php
的页面将尝试使用 slug
列来解析绑定的模型,而不是 id
列。
在 Windows 上,您应该使用 -
来分隔模型名称和键名: [Post-slug].blade.php
。
模型位置
默认情况下,Folio 将在您的应用程序的 app/Models
目录中搜索您的模型。然而,如果需要,您可以在模板文件名中指定完全限定模型类名:
bash
php artisan folio:page "users/[.App.Models.User]"
# pages/users/[.App.Models.User].blade.php → /users/1
软删除模型
默认情况下,软删除的模型不会在解析隐式模型绑定时被检索。然而,如果您希望,您可以在页面模板中调用 withTrashed
函数来检索软删除的模型:
php
<?php
use function Laravel\Folio\{withTrashed};
withTrashed();
?>
<div>
User {{ $user->id }}
</div>
渲染钩子
默认情况下,Folio 将返回页面模板的内容作为对 incoming 请求的响应。然而,您可以通过在页面模板中调用 render
函数来自定义响应。
render
函数接受一个闭包,该闭包将接收正在被 Folio 渲染的 View
实例,并允许您向视图添加额外的数据或自定义整个响应。除了接收 View
实例外,任何额外的路由参数或模型绑定也将被提供给 render
闭包:
php
<?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
<?php
use function Laravel\Folio\name;
name('users.index');
就像 Laravel 的命名路由一样,您可以使用 route
函数生成到具有指定名称的 Folio 页面的 URL:
php
<a href="{{ route('users.index') }}">
All Users
</a>
如果页面有参数,您可以简单地将它们的值传递给 route
函数:
php
route('users.show', ['user' => $user]);
中间件
您可以通过在页面模板中调用 middleware
函数为给定页面指定中间件:
php
<?php
use function Laravel\Folio\{middleware};
middleware(['auth', 'verified']);
?>
<div>
Dashboard
</div>
或者,您可以在 Folio 服务提供商的 boot
方法中为一组页面指定中间件。
要指定中间件应该应用到的页面,中间件数组可以使用对应的 URL 模式作为键。您可以使用 *
字符作为通配符:
php
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
// ...
],
]);
您可以在中间件数组中包含闭包来定义内联、匿名中间件:
php
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 页面定义和路由名称被正确缓存以获得最佳性能。