Публикации - Laravel

Решение типовых задач на Laravel - ServiceProvider и передача переменных в шаблоны

Поставщик услуг ServiceProvider

Основная задача поставщика услуг, или ServiceProviders – это загрузка вспомогательных, в том числе, и собственных классов.

Если открыть конфигурационный файлa app.php, то мы увидим там множество провайдеров, определенных в массиве providers. Это все классы, которые будут загружены для приложения. Многие из них являются отложенными, что означает, что они не будут загружаться при каждом запросе, а только тогда, когда они действительно необходимы, т.е. когда они будут вызываться.

Все провайдеры должны наследоваться от класса Illuminate\Support\ServiceProvider. Данный абстрактный класс требует, чтобы был определен хотя бы один метод класса-провайдера: register. В этом методе регистрируется вспомогательный класс.

Сам провайдер можно создать с помощью artisan:

php artisan make:provider SizeServiceProvider

В папке providers/ появился файл SizeServiceProvider. Так выглядит класс пустого провайдера:

class SizeServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
         
    }
}

После вызова методов register() всех сервис-провайдеров приложения, вызывается метод boot(). Там уже можно использовать весь существующий функционал классов фреймворка и приложения - регистрировать слушателей событий, подключать роуты и т.п.

Метод register() предназначен для загрузки вспомогательных классов с предопределенными входящими параметрами, которые определяются в этом же методе. Для всего остального предназначен метод boot().

Передача переменных из провайдера в элементы представлений

После создания провайдера, опишем логику метода boot():

namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;
use App\Providers\ViewComposers\SizeComposer;


class SizeServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer('*', 'App\Providers\ViewComposers\SizeComposer');
        View::composer('manager.*', 'App\Providers\ViewComposers\ManagerComposer');
    }
}

В данном случае, мы со всеми шаблонами (символ * указывает на все шаблоны) связали логику класса SizeComposer. Далее необходимо создать папку ViewComposers в App\Providers, где реализовать два класса SizeComposer (который определяет переменные для всех шаблонов), и класс ManagerComposer, который определяет переменные для всех шаблонов, находящихся в resources\views\manager.

Рассмотрим логику класса SizeComposer, который передает переменные во все файлы шаблонов. В нем должен быть реализован метод compose. В метод внедряется объект текущего шаблона, а возвращает тот же шаблон, но с переменными.

namespace App\Providers\ViewComposers;

use Illuminate\Contracts\View\View;
use App\Catalogs;
use Auth;

class ManagerComposer
{
    public function compose(View $view)
    {
        $ur = url()->full();
        $arr = explode('/', $ur);
        $end = end($arr);
        $catalogs = Catalogs::all();
        $view->with('end', $end)->with('catalogs', $catalogs);
    }
}

Провайдеры регистрируются в файле config/app.php

'providers' => [
    // другие сервис-провайдеры 
    'App\Providers\AppServiceProvider',
],

Количество комментариев: 0

Для того, чтобы оставить коментарий необходимо зарегистрироваться


Изображения Видео

1. Подключение CKEditor https://artisansweb.net/install-use-ckeditor-laravel/#comments
2. Регистрация и авторизация https://know-online.com/post/laravel-reg
3. Что нового в Laravel 8 https://sergeymukhin.com/blog/chto-novogo-v-laravel-80
4. Авторизация Sanctum <iframe width="560" height="315" src="https://www.youtube.com/embed/MT-GJQIY3EU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>