- Введение
- Установка
- Создание маршрутов
- Параметры маршрутов
- Привязка моделей к маршрутам
- Хуки рендеринга
- Именованные маршруты
- Middleware
- Кэширование маршрутов
#Введение
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 к конкретной странице, вызвав функцию middleware внутри шаблона страницы:
<?php
use function Laravel\Folio\{middleware};
middleware(['auth', 'verified']);
?>
<div>
Dashboard
</div>
Или, чтобы назначить middleware группе страниц, можно вызвать метод middleware после метода Folio::path.
Чтобы указать, к каким страницам применять middleware, массив middleware может быть ключом с соответствующими URL-шаблонами страниц. Символ * может использоваться как подстановочный знак:
use Laravel\Folio\Folio;
Folio::path(resource_path('views/pages'))->middleware([
'admin/*' => [
'auth',
'verified',
// ...
],
]);
Вы можете включать замыкания в массив middleware для определения встроенного анонимного middleware:
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 и имён маршрутов для максимальной производительности.