Laravel Folio

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

Как это работает

После установки Folio вы можете создать новую страницу с помощью команды artisan:

php artisan make:folio index

Новый файл появится в папке pagesresources/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.