Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.
Ищете работу? Мы поможем!
Ищете работу? Мы поможем!

Laravel Folio

Введение

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, чем остальные страницы 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>
    Пользователь {{ $id }}
</div>

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

php artisan make:folio "users/[...ids]"

# pages/users/[...ids].blade.php → /users/1/2/3

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

<ul>
    @foreach ($ids as $id)
        <li>Пользователь {{ $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->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->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>
    Этот автор также сделал {{ count($photos) }} фотографий.
</div>

Именованные маршруты

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

<?php

use function Laravel\Folio\name;

name('users.index');

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

<a href="{{ route('users.index') }}">
    Все пользователи
</a>

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

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

Промежуточное ПО (Middleware)

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

<?php

use function Laravel\Folio\{middleware};

middleware(['auth', 'verified']);

?>

<div>
    Панель управления
</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 и имена маршрутов должны быть правильно закэшированы для максимальной производительности.