В проектах часто возникает ситуация: у тебя есть несколько реализаций одного сервиса — API, драйверы, разные способы работы с базой. Хочется менять их, не трогая основной код. Manager в Laravel как раз для этого.

Создание Manager

Создать свой Manager просто:

namespace App\Managers;

use Illuminate\Support\Manager;

class CustomManager extends Manager
{
    // Здесь будут методы для управления драйверами
}

Тут мы расширяем базовый Illuminate\Support\Manager и получаем доступ ко всем базовым методам работы с драйверами.

Регистрация Manager

Чтобы Laravel знал о твоем Manager, регистрируем его в контейнере сервисов, например в AppServiceProvider:

$this->app->singleton('custom.manager', function ($app) {
    return new \App\Managers\CustomManager($app);
});

Теперь app('custom.manager') будет возвращать один и тот же экземпляр, готовый к использованию.

Использование Manager

В Manager обычно есть метод driver, который возвращает нужную реализацию сервиса:

public function driver($driver = null)
{
    $driver = $driver ?: $this->getDefaultDriver();

    return $this->createDriver($driver);
}

protected function createDriver($driver)
{
    // Создаем конкретный сервис по имени драйвера
}

Пример использования:

$apiService = app('custom.manager')->driver('api_service_name');

Теперь можно легко переключаться между разными API или реализациями, не трогая основной код.

Расширение Manager

Manager можно прокачать:

  • Кэшировать созданные сервисы, чтобы не создавать каждый раз новый экземпляр.
  • Автоматически выбирать драйвер по конфигурации.
  • Добавлять свои методы для логики, специфичной для твоего приложения.

Это делает Manager настоящим комбайном для управления сервисами.

Заключение

Manager в Laravel — это простой способ держать сервисы под контролем и не превращать проект в спагетти. Используя драйверы и централизованное управление зависимостями, можно менять реализации без боли. Если правильно его настроить, код становится чистым, гибким и поддерживаемым.