За последние 24 часа нас посетили 22839 программистов и 1267 роботов. Сейчас ищут 803 программиста ...

Какой паттерн выбрать с DI?

Тема в разделе "PHP для профи", создана пользователем davidtema, 10 сен 2020.

  1. davidtema

    davidtema Новичок

    С нами с:
    10 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    Есть сервис из контейнера.
    В этом сервисе нужно сделать инстанс некоторого объекта (известен только интерфейс).
    Как в этом случае поступают?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    DI-контейнер. Во всех фреймворках есть. Есть и фреймворко-независимые. https://php-di.org/, например
     
  3. davidtema

    davidtema Новичок

    С нами с:
    10 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    В моём случае, мне нужно не готовый объект получать, а создавать инстанс на месте в результате ответа API. Я бы хотел просто настраивать контейнер, указывая инстанс какого класса обработчик должен создавать в результате ответа API.
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    А причём тут DI? Сделай фабрику, которая будет анализировать ответ апи и создавать нужный объект класса.
     
  5. davidtema

    davidtema Новичок

    С нами с:
    10 сен 2020
    Сообщения:
    3
    Симпатии:
    0
    Затем, что тип объекта нужно определять не в момент обработки ответа, а заранее на уровне контейнера. Конечно, можно в контейнере прописать нужную фабрику, которая будет создавать конкретный объект, но тип-то один. Но я ищу более солидное решение.
     
    #5 davidtema, 10 сен 2020
    Последнее редактирование: 10 сен 2020
  6. Abyss

    Abyss Старожил

    С нами с:
    12 дек 2015
    Сообщения:
    1.298
    Симпатии:
    218
    Адрес:
    Default city
    SOLID'ное ?
    Покажете ?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ничерта не понимаю :) Есть контейнер. Есть имя класса ли, интерфейса ли, чего угодно, по которому контейнер умеет инстанциировать объект. Что надо ещё придумать? Как выбирать имя в зависимости от входящих параметров API?

    Составь белый список Значение => Класс, помести его в отдельный класс-резолвер, используй в эндпоинте.
     
    Вероломство нравится это.
  8. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    не-не-не, есть контейнер с массивом объектов))) ты видимо об этом

    а вот, если есть массив НЕЙМСПЕЙСОВ и при обращении к одному из них идёт создание объекта - это уже другое)))

    и хватит везде уже советовать этот php-di, не подходит он для частных случаев, мне нужна одна сущность для всех юзеров, например, как мне её запихать в контейнер, чтобы находясь тупо на странице одного юзера смотреть другИХ, всех юзеров запихать в контейнер? Это уже обсуждалось: контейнер для ядра, это можно по-старинке сделать реестром либо общими функциями либо просто там где надо вызвать то что надо. А просто для красоты кода - пфффф, не нужно.
     
    #8 Вероломство, 9 янв 2021
    Последнее редактирование: 9 янв 2021
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.555
    Симпатии:
    1.754
    Это делает весь код зависимым от реестра. Главная фишка DI - сами классы понятия не имеют, где создаются их зависимости. Через DI-контейнер, либо прямо через new на клиенте, либо ещё как-то. Они говорят: мне нужна такая-то зависимость, бери её где хочешь, но при создании меня, передай её мне. И да, никто не говорит, что в контейнер надо сувать прямо все-все-все экземпляры
     
    valentinnew и Вероломство нравится это.
  10. Вероломство

    Вероломство Активный пользователь

    С нами с:
    19 июн 2017
    Сообщения:
    615
    Симпатии:
    24
    так-то да, согласен полностью с таким комментом +