Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти
Інше
Події Про нас

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 ви можете виконати артизан-команду 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, скористайтеся артизан-командою folio:list:

php artisan folio:list

Вкладені маршрути

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

php artisan folio:page user/profile

# pages/user/profile.blade.php → /user/profile

Індексні маршрути

Іноді вам може знадобитися зробити певну сторінку «індексом» каталогу. Якщо розмістити шаблон index.blade.php у каталозі Folio, будь-які запити до кореня цього каталогу будуть спрямовані на цю сторінку:

php artisan folio:page index
# pages/index.blade.php → /

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

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

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

php artisan folio:page "users/[id]"

# pages/users/[id].blade.php → /users/1

Захоплені сегменти доступні як змінні у вашому Blade-шаблоні:

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

Щоб захопити кілька сегментів, додайте перед узятим у дужки сегментом три крапки ...:

php artisan folio:page "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 folio:page "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 folio:page "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 слухає артизан-команду route:cache, щоб гарантувати, що визначення сторінок і імена маршрутів Folio будуть належно закешовані для максимальної продуктивності.