编程

Laravel Folio —— 基于页面的路由系统

1170 2023-10-14 09:50:00

Laravel Folio 是一个 LaraconUS 2023 引入 Laravel 的基于页面的路由系统。 

使用 Laravel Folio 可以将路由轻松匹配到一个指定文件或路由,类似于 NextJS 或者 NuxtJS 这些框架基于文件路由的系统。

工作原理

将Folio安装到应用之后,你可以使用如下命令创建一个新页面:

php artisan make:folio index

该命令将会在新的页面目录中放置一个新的文件resources/views/pages/index.blade.php。 

现在,如果你在浏览器中访问,它将载入该模板作为首页。

通配符页面

我们也可以通过通配符创建动态页面。比如我们访问像 /users/1 这样的路由,我们可以在 users 目录中创建一个[id].blade.php。像这样:

├── resources
│   ├── views
│   │   ├── pages
│   │   │   ├── users
│   │   │   │   ├── [id].blade.php

在文件中,我们现在可以访问$id,它可以用来查找用户。

更进一步,我们可以利用路由模型绑定并重命名文件为 [User:id].blade.php

├── resources
│   ├── views
│   │   ├── pages
│   │   │   ├── users
│   │   │   │   ├── [User:id].blade.php

在文件中,我们现在可以访问 $user 对象了

如果,我们想要在 URL 参数中指定 usernamr,我们也可以将文件重命名为  [User:username].blade.php. 然后,通过 /users/taylorotwell 访问应用时,将能访问到 username 为 taylorotwell 的 user 对象。示例如下:

<x-layout>
    <h1>Hello {{ $user->name }}</h1>
</x-layout>

通配符目录

我们也可以创建通配符目录。要说明这样的示例,假设我们要为每个用户创建 info 页面。我们可以通过创建以下的目录结构创建一个动态的 URL:/users/taylorotwell/info:

├── resources
│   ├── views
│   │   ├── pages
│   │   │   ├── users
│   │   │   │   ├── [User:username]
│   │   │   │   │   ├── info.blade.php

我们也可以使用动态页面创建动态目录,像这样:

├── resources
│   ├── views
│   │   ├── pages
│   │   │   ├── users
│   │   │   │   ├── [User]
│   │   │   │   │   ├── posts
│   │   │   │   │   │   ├── [Post:slug].blade.php

这将让我们可以这样访问应用的路由: /users/1/posts/folio-is-awesome。访问该路由时,Folio 将尝试并查找属于用户id为1,slug 为 folio-is-awesome 的 post。 

Folio 中间件

您还可以利用基于页面的路由中间件。使用上一节中的 posts 示例,我们可以通过在 app/Policies 目录中添加一个新的 Policy 来实现这一点,如下所示:

<?php

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    public function view(?User $user, Post $post){
    {
        return false; // return the logic that allows or disallows access
    }
}

然后,在视图中我们可以添加如下代码:

<?php

use function Laravel\Folio\{middleware};

middleware(['can:view,post']);

?>
<x-layout>
    <h1>{{ $post->title }}</h1>
    <article>{!! $post->body !!}</article>
</x-layout>

如果用户没有权限,他们将看到 403 权限码否则,它们就能访问该 post。

多分段页面

您还可以创建一个文件,将URL中的所有分段返回到页面。例如,如果我们的文件夹结构如下所示:

├── resources
│   ├── views
│   │   ├── pages
│   │   │   ├── multi
│   │   │   │   ├── [...ids].blade.php

它将捕获位于/multi/1/2/3 的URL,并向页面返回$id的数组。 

结论

使用 Laravel-Folio,我们可以通过在页面视图目录中添加文件或文件夹来在应用程序中创建路由。您也可以选择在应用程序中混合使用基于页面的路由和传统路由。