1. Пакеты
  2. Laravel Folio

Присоединяйся к нашему Telegram сообществу @webblend!

Здесь ты найдешь сниппеты по Laravel и полезные советы по веб-разработке.

Введение

Laravel Folio - мощный маршрутизатор на основе страниц, разработанный для упрощения маршрутизации в приложениях Laravel. С Laravel Folio создание маршрута становится таким же простым, как создание шаблона Blade в каталоге resources/views/pages вашего приложения.

Например, чтобы создать страницу, доступную по URL /greeting, просто создайте файл greeting.blade.php в каталоге resources/views/pages вашего приложения:

<div>
Hello World
</div>

Установка

Для начала установите Folio в свой проект с использованием менеджера пакетов Composer:

composer require laravel/folio

После установки Folio вы можете выполнить команду Artisan folio:install, которая установит служебный провайдер Folio в вашем приложении. Этот служебный провайдер регистрирует каталог, в котором Folio будет искать маршруты / страницы:

php artisan folio:install

Пути страниц / URI

По умолчанию Folio обслуживает страницы из каталога resources/views/pages вашего приложения, но вы можете настроить эти каталоги в методе boot вашего служебного провайдера Folio.

Например, иногда удобно указать несколько путей Folio в одном и том же приложении Laravel. Вам может потребоваться иметь отдельный каталог страниц Folio для "административного" раздела вашего приложения, используя другой каталог для остальных страниц вашего приложения.

Это можно сделать с использованием методов Folio::path и Folio::uri. Метод path регистрирует каталог, который Folio будет сканировать для страниц при маршрутизации входящих HTTP-запросов, в то время как метод uri указывает "базовый URI" для этого каталога страниц:

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. Вы можете сделать это, вызвав метод domain после вызова метода Folio::path:

use Laravel\Folio\Folio;
 
Folio::domain('admin.example.com')
->path(resource_path('views/pages/admin'));

Метод domain также позволяет вам захватывать части домена или поддомена в качестве параметров. Эти параметры будут внедрены в ваш шаблон страницы:

use Laravel\Folio\Folio;
 
Folio::domain('{account}.example.com')
->path(resource_path('views/pages/admin'));

Создание маршрутов

Вы можете создать маршрут Folio, разместив шаблон Blade в любом из ваших подключенных каталогов Folio. По умолчанию Folio подключает каталог resources/views/pages, но вы можете настроить эти каталоги в методе boot служебного провайдера Folio.

После того как шаблон Blade размещен в подключенном каталоге Folio, вы можете сразу получить к нему доступ через браузер. Например, страница, размещенная в pages/schedule.blade.php, может быть доступна в вашем браузере по адресу http://example.com/schedule.

Чтобы быстро просмотреть список всех страниц / маршрутов вашего Folio, вы можете вызвать команду Artisan folio:list:

php artisan folio:list

Вложенные маршруты

Вы можете создать вложенный маршрут, создав один или несколько каталогов в одном из каталогов Folio. Например, чтобы создать страницу, доступную по /user/profile, создайте шаблон profile.blade.php в каталоге pages/user:

php artisan make:folio user/profile
 
# pages/user/profile.blade.php → /user/profile

Индексные маршруты

Иногда вам может потребоваться сделать определенную страницу "индексной" для каталога. Разместив шаблон index.blade.php в каталоге Folio, любые запросы к корню этого каталога будут направлены на эту страницу:

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

Параметры маршрута

Часто вам нужно вставлять сегменты URL входящего запроса в вашу страницу, чтобы вы могли с ними взаимодействовать. Например, вам может потребоваться получить доступ к "ID" пользователя, чей профиль отображается. Для этого вы можете заключить сегмент имени файла страницы в квадратные скобки:

php artisan make:folio "users/[id]"
 
# pages/users/[id].blade.php → /users/1

Захваченные сегменты можно получить как переменные в вашем шаблоне Blade:

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

Для захвата нескольких сегментов вы можете предварить захваченный сегмент тремя точками ...:

php artisan make:folio "users/[...ids]"
 
# pages/users/[...ids].blade.php → /users/1/2/3

При захвате нескольких сегментов захваченные сегменты будут вставлены в страницу как массив:

<ul>
@foreach ($ids as $id)
<li>User {{ $id }}</li>
@endforeach
</ul>

Привязка модели маршрута

Если подстановочный сегмент имени файла вашего шаблона соответствует одной из моделей Eloquent вашего приложения, Folio автоматически воспользуется возможностями привязки модели маршрута Laravel и попытается вставить разрешенный экземпляр модели в вашу страницу:

php artisan make:folio "users/[User]"
 
# pages/users/[User].blade.php → /users/1

Захваченные модели можно получить как переменные в вашем шаблоне Blade. Имя переменной модели будет преобразовано в "camel case":

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

Настройка ключа

Иногда вы можете захотеть разрешить связанные модели Eloquent, используя столбец отличный от id. Для этого вы можете указать столбец в имени файла страницы. Например, страница с именем файла [Post:slug].blade.php будет пытаться разрешить связанную модель через столбец slug вместо столбца id.

На Windows вы должны использовать - для разделения имени модели от ключа: [Post-slug].blade.php.

Расположение модели

По умолчанию Folio будет искать вашу модель в каталоге app/Models вашего приложения. Однако при необходимости вы можете указать полностью квалифицированное имя класса модели в имени файла вашего шаблона:

php artisan make:folio "users/[.App.Models.User]"
 
# pages/users/[.App.Models.User].blade.php → /users/1

Мягкое удаление моделей

По умолчанию модели, которые были мягко удалены, не извлекаются при разрешении неявных привязок моделей. Однако, если вы хотите, вы можете указать Folio извлекать мягко удаленные модели, вызвав функцию withTrashed в шаблоне страницы:

<?php
 
use function Laravel\Folio\{withTrashed};
 
withTrashed();
 
?>
 
<div>
User {{ $user->id }}
</div>

Хуки рендеринга

По умолчанию Folio вернет содержимое шаблона Blade страницы в качестве ответа на входящий запрос. Однако вы можете настроить ответ, вызвав функцию render в шаблоне страницы.

Функция render принимает замыкание, которое будет получать экземпляр View, который рендерится Folio, позволяя вам добавлять дополнительные данные к представлению или настраивать весь ответ. Помимо экземпляра View, замыканию render также будут предоставлены любые дополнительные параметры маршрута или привязки модели:

<?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
 
use function Laravel\Folio\name;
 
name('users.index');

Как и именованные маршруты в Laravel, вы можете использовать функцию route для создания URL-адресов страниц Folio, которые были назначены именем:

<a href="{{ route('users.index') }}">
All Users
</a>

Если у страницы есть параметры, вы можете просто передать их значения функции route:

route('users.show', ['user' => $user]);

Промежуточные слои (Middleware)

Вы можете применить промежуточный слой к определенной странице, вызвав функцию middleware в шаблоне страницы:

<?php
 
use function Laravel\Folio\{middleware};
 
middleware(['auth', 'verified']);
 
?>
 
<div>
Dashboard
</div>

Или, чтобы назначить промежуточные слои группе страниц, вы можете применить метод middleware после вызова метода Folio::path.

Чтобы указать, к каким страницам следует применять промежуточный слой, массив промежуточных слоев может быть проиндексирован с использованием соответствующих шаблонов URL страниц, к которым они должны быть применены. Символ * может использоваться в качестве символа подстановки:

use Laravel\Folio\Folio;
 
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
 
// ...
],
]);

Вы можете включать замыкания в массив промежуточных слоев, чтобы определить встроенные, анонимные промежуточные слои:

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 отслеживает команду Artisan route:cache, чтобы убедиться, что определения страниц и имена маршрутов Folio правильно кешируются для достижения максимальной производительности.