Что такое сервис-провайдер в Laravel?

Ответ

Сервис-провайдер в Laravel — это класс, который регистрирует привязки в сервис-контейнере и выполняет начальную загрузку компонентов приложения. Это центральный механизм для настройки сервисов, подключения маршрутов, представлений, миграций и других частей фреймворка.

Основные методы:

  • register() — используется только для регистрации привязок в контейнере. Здесь не следует обращаться к другим сервисам, так как они могут быть ещё не зарегистрированы.
  • boot() — вызывается после регистрации всех провайдеров. Здесь безопасно выполнять любую логику инициализации, например, определять маршруты, публиковать ассеты или делиться данными с представлениями.

Пример провайдера для регистрации кастомного сервиса:

<?php

namespace AppProviders;

use IlluminateSupportServiceProvider;
use AppServicesPaymentGateway;

class PaymentServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        // Регистрируем синглтон в контейнере
        $this->app->singleton(PaymentGateway::class, function ($app) {
            return new PaymentGateway(config('services.payment.secret'));
        });
    }

    public function boot(): void
    {
        // После загрузки всех провайдеров добавляем глобальную перемену для всех views
        IlluminateSupportFacadesView::share('appVersion', '1.0.0');
    }
}

Регистрация провайдера: Провайдеры добавляются в массив providers в файле config/app.php. Laravel автоматически загружает и выполняет их при запуске приложения. Это позволяет организовать код в модули и управлять зависимостями.

Ответ 18+ 🔞

А, слушай, про сервис-провайдеры в Laravel? Ну это ж классика, ёпта. Представь себе такую штуку — это как главный снабженец на стройке твоего приложения. Он не кирпичи кладёт, а впендюривает в контейнер все нужные инструменты и говорит всем, где что лежит, чтобы потом не бегать и не искать.

Основная фишка в двух методах, и тут важно не перепутать, а то будет тебе хиросима и нигерсраки.

  • register() — это когда ты только заносишь инструменты на склад. Ты говоришь: «Слушай, контейнер, вот если кто попросит PaymentGateway, ты выдай вот этот конкретный экземпляр». Но ни в коем случае не начинай тут этими инструментами пользоваться! Потому что другой чувак мог свой ящик с гвоздями ещё не зарегистрировать, и ты охуеешь, когда всё рухнет. Тут только привязки, тихо и спокойно.
  • boot() — а вот это уже полный улет. Этот метод вызывается, когда все снабженцы уже отчитались и весь склад забит под завязку. Вот тут-то можно взъебнуть на полную: маршруты навешивать, вид шары глобальные кидать, конфиги подтягивать — делай что хочешь, всё уже готово.

Вот смотри, как это выглядит в коде, простой пример:

<?php

namespace AppProviders;

use IlluminateSupportServiceProvider;
use AppServicesPaymentGateway;

class PaymentServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        // Говорим контейнеру: «Дружище, PaymentGateway — это синглтон, создай его один раз и больше не мучайся»
        $this->app->singleton(PaymentGateway::class, function ($app) {
            return new PaymentGateway(config('services.payment.secret'));
        });
    }

    public function boot(): void
    {
        // А тут, когда всё загрузилось, можем, например, всем шарикам впихнуть версию приложения
        IlluminateSupportFacadesView::share('appVersion', '1.0.0');
    }
}

Как это всё оживает? А просто. Ты пишешь этого провайдера в массив providers в config/app.php. Laravel при старте видит это, подозрение ебать чувствует, и начинает их всех по очереди грузить: сначала у всех register(), потом у всех boot(). В итоге получается аккуратная система, где каждый отвечает за свой кусок, а не распиздяй какой-нибудь.

Короче, доверия ебать ноль к коду, где всё свалено в кучу. А с провайдерами — красота, модульно и понятно, где что инициализируется. Волнение ебать пропадает, когда знаешь, в каком порядке что выполнится.