Можно ли считать DI контейнер подобием фабрики или что я делаю не так?

Делаю инъекцию в конструктор контроллера, а потом просто вызываю метод.
Так выглядит мой сервис-провайдер
public function register()
    {
        //
        $this->app->bind(CampaignService::class, function($app) {
            $entityManager = $app->make('registry')->getManager();
            $doctrineCampaignRepository = new DoctrineCampaignRepository($entityManager, $entityManager->getRepository(Campaign::class));
            $doctrineCampaignTypeRepository = new DoctrineCampaignTypeRepository($entityManager);
            $doctrineCampaignCategoryRepository = new DoctrineCampaignCategoryRepository($entityManager);
            return new CampaignService($doctrineCampaignRepository, $doctrineCampaignTypeRepository, $doctrineCampaignCategoryRepository);
        });
    }


Впервые работаю с сервис-провайдерами и контейнерами, но верно ли я делаю это? Выглядит как подобие фабрики, разве нет? Или оно так и есть или я использую не по назначению это, укажите на ошибки, пожалуйста
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
SerafimArts
@SerafimArts
Senior Notepad Reader
Метод bind как раз и регистрирует "фабрику". Т.е. при каждом резолве (получения) сервиса из контейнера - он будет создаваться по определяемой схеме.

$container->call(function(CampaignService $c): void {
    echo \spl_object_id($c); // 1
});

$container->call(function(CampaignService $c): void {
    echo \spl_object_id($c); // 2
});


Если сервис должен быть константным, то имеет смысл bind заменить на singleton

$container->call(function(CampaignService $c): void {
    echo \spl_object_id($c); // 1
});

$container->call(function(CampaignService $c): void {
    echo \spl_object_id($c); // 1
});
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы