Основная задача поставщика услуг, или 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', ],