Новый пакет для маршрутизации на основе страниц, представленный на конференции 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.