Skip to content
虚位以待
赞助商赞助商
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Folio

介绍

Laravel Folio 是一个强大的基于页面的路由器,旨在简化 Laravel 应用程序中的路由。使用 Laravel Folio,生成路由就像在应用程序的 resources/views/pages 目录中创建一个 Blade 模板一样简单。

例如,要创建一个可以通过 /greeting URL 访问的页面,只需在应用程序的 resources/views/pages 目录中创建一个 greeting.blade.php 文件:

php
<div>
    Hello World
</div>

安装

要开始使用,请使用 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 方法中自定义这些目录。

例如,有时可能需要在同一个 Laravel 应用程序中指定多个 Folio 路径。您可能希望为应用程序的“管理”区域使用一个单独的 Folio 页面目录,同时为应用程序的其他页面使用另一个目录。

可以使用 Folio::pathFolio::uri 方法实现这一点。path 方法注册一个目录,Folio 在路由传入的 HTTP 请求时会扫描该目录中的页面,而 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',

            // ...
        ],
    ]);

子域路由

您还可以根据传入请求的子域路由到页面。例如,您可能希望将 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 方法中自定义这些目录。

一旦将 Blade 模板放置在 Folio 挂载的目录中,就可以立即通过浏览器访问它。例如,放置在 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 make:folio user/profile

# pages/user/profile.blade.php → /user/profile

索引路由

有时,您可能希望将某个页面设为目录的“索引”。通过在 Folio 目录中放置一个 index.blade.php 模板,任何对该目录根的请求都将路由到该页面:

bash
php artisan make:folio index
# pages/index.blade.php → /

php artisan make:folio users/index
# pages/users/index.blade.php → /users

路由参数

通常,您需要将传入请求的 URL 段注入到页面中,以便与之交互。例如,您可能需要访问正在显示的用户的“ID”。为此,可以将页面文件名的一段用方括号括起来:

bash
php artisan make:folio "users/[id]"

# pages/users/[id].blade.php → /users/1

捕获的段可以作为变量在 Blade 模板中访问:

html
<div>User {{ $id }}</div>

要捕获多个段,可以在括起来的段前加上三个点 ...

bash
php artisan make:folio "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 make:folio "users/[User]"

# pages/users/[User].blade.php → /users/1

捕获的模型可以作为变量在 Blade 模板中访问。模型的变量名将转换为“驼峰式”:

html
<div>User {{ $user->id }}</div>

自定义键

有时,您可能希望使用 id 以外的列来解析绑定的 Eloquent 模型。为此,可以在页面的文件名中指定列。例如,文件名为 [Post:slug].blade.php 的页面将尝试通过 slug 列解析绑定的模型,而不是 id 列。

在 Windows 上,应使用 - 将模型名称与键分开:[Post-slug].blade.php

模型位置

默认情况下,Folio 将在应用程序的 app/Models 目录中搜索模型。但是,如果需要,可以在模板的文件名中指定完全限定的模型类名:

bash
php artisan make:folio "users/[.App.Models.User]"

# pages/users/[.App.Models.User].blade.php → /users/1

软删除模型

默认情况下,软删除的模型在解析隐式模型绑定时不会被检索。但是,如果需要,可以通过在页面的模板中调用 withTrashed 函数来指示 Folio 检索软删除的模型:

php
<?php

use function Laravel\Folio\{withTrashed};

withTrashed();

?>

<div>
    User {{ $user->id }}
</div>

渲染钩子

默认情况下,Folio 将返回页面 Blade 模板的内容作为传入请求的响应。但是,可以通过在页面的模板中调用 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::path 方法后链接 middleware 方法。

要指定应将中间件应用于哪些页面,可以使用页面对应的 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 页面定义和路由名称被正确缓存以获得最大性能。