Новый пакет для маршрутизации на основе страниц, представленный на конференции LaraconUS 2023. С помощью Folio можно сопоставлять маршрут с файлами и каталогами, аналогично системе маршрутизации в таких фреймворках как NextJS или NuxtJS.

Как это работает
После установки Folio вы можете создать новую страницу с помощью команды artisan:
php artisan make:folio index
Новый файл появится в папке pages — resources/views/pages/index.blade.php

Теперь при открытии вашего приложения в браузере этот шаблон будет отображен в качестве главной страницы.
Wildcard-страницы
Можно создавать динамические страницы, используя подстановочные знаки (wildcards). Например, нам нужен маршрут вида /users/1.
Для этого создаем файл [id].blade.php в папке users:
├── resources │ ├── views │ │ ├── pages │ │ │ ├── users │ │ │ │ ├── [id].blade.php
Теперь внутри этого файла у нас будет доступ к $id, которую можно использовать для поиска пользователя. Более того, мы можем воспользоваться Привязкой моделей к маршрутам и переименовать этот файл в [User:id].blade.php.
├── resources │ ├── views │ │ ├── pages │ │ │ ├── users │ │ │ │ ├── [User:id].blade.php
Теперь внутри этого файла у нас будет доступ к объекту $user.
Если вместо этого нам нужно использовать в адресе имя пользователя (username), то просто переименовываем файл в [User:username].blade.php.
Теперь, если зайти, например, на страницу /users/taylorotwell, то получим доступ к объекту, чей username это taylorotwell. Вот код вывода его имени:
<x-layout>
<h1>Hello {{ $user->name }}</h1>
</x-layout>
Wildcard-каталоги
Можно создавать каталоги с подстановочными знаками (wildcards). Например, нам нужна информационная страница для каждого пользователя. Создадим динамический адрес, вида /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 попытается найти слаг folio -is-awesome, принадлежащий пользователю с идентификатором 1.
Folio Middleware
Также можно воспользоваться преимуществами предлагаемых мидлваров. Используя вышеприведенный пример мы можем добавить новую политику в каталог app/Policies:
namespace App\Policies;
use App\Models\Post;
use App\Models\User;
class PostPolicy
{
public function view(?User $user, Post $post){
{
return false; // логическое разрешение или запрещение доступа
}
}
Затем, в шаблоне добавляем следующий код:
<?php
use function Laravel\Folio\{middleware};
middleware(['can:view,post']);
?>
<x-layout>
<h1>{{ $post->title }}</h1>
<article>{!! $post->body !!}</article>
</x-layout>
Если у пользователя нет доступа, то он увидит код 403 Forbidden.
Мультисегментные страницы
Также можно создать файл, который вернет все сегменты адреса на страницу. Например, если у нас есть следующая структура каталогов:
├── resources │ ├── views │ │ ├── pages │ │ │ ├── multi │ │ │ │ ├── [...ids].blade.php
Он охватит адреса /multi/1/2/3 и вернет массив $id на страницу.
Заключение
Используя Laravel Folio, мы можем создавать маршруты в нашем приложении просто добавляя файлы и каталоги в директорию pages. Вы можете совмещать этот метод с традиционными маршрутами.
Узнать больше о Laravel Folio можно по адресу https://github.com/laravel/folio. Рекомендуем использовать Laravel Folio совместо с Volt (однофайловые livewire-компоненты).
Автор: Tony Lea
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.
