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

«Что такое сервис-провайдер в Laravel?» — вопрос из категории Laravel, который задают на 28% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сервис-провайдер в 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 автоматически загружает и выполняет их при запуске приложения. Это позволяет организовать код в модули и управлять зависимостями.