@symnoob

Как это работает в symfony через Interface?

Всем привет, может кто помочь разобраться с интерфейсоми и DI контейнероми?

Вот взять например тот же самый knp_pagination bundle. Инжектим интерфейс, передаём параметры. И готово. Такой сложный механизм как пагинация работает без проблем. Вот этой магии мне не понять. Я думал что интерфейсы работаю как инструкция. Там стоят методы которые нужно заполнить кодом. И вернуть что-то. А тут как-то передал параметры и всё...
  • Вопрос задан
  • 81 просмотр
Пригласить эксперта
Ответы на вопрос 1
gzhegow
@gzhegow
Думал, стану умнее, когда адаптируюсь, но нет
Я не отвечу тебе как оно внутри в симфони работает, но попробую добавить кое-что по интерфейсам

Интерфейс в общем случае это контракт, похожий на тот, что дают тебе на работе, когда принимают тебя.
Их не заполняют кодом, они как бы являются соглашением сторон - в нашем случае двух классов - о том, что то, что "прокидывается через интерфейс" обязательно умеет то, что написано в контракте, иначе программа не компилируется и не может быть выполнена.

С точки зрения управляющего зависимостями интерфейс это всего лишь название. Такое же как просто строка "апп.модульВася". Дальше сие пробросится через конструктор, который уже по логике ПХП проверит, то что было создано и подсунуто по этому названию - умеет ли то, что написано в интерфейсе? Нет? Ошибка. Кроме того сама пхп ещё до момента создания обьектов когда ты пишешь implements Интерфейс проверяет - умеет ли класс то, что он имплементит - тут как бы двойная связка

Интерфейс это всего лишь соглашение сторон, с другой стороны - интерфейс - это мощная гарантия умения делать что-либо. То есть не важно как называется обьект "гриша.модуль", "петя.суперМодуль" или "вася.гиперМодуль" - они должны уметь раз, два, три. Таким образом мы можешь прибить контракт к исполнителям, и потом тихонько подменить один на другой, чтобы никто не заметил и ничего не сломалось.

Ты можешь и просто создать некий класс, приняв для себя что "пока что мне хватит его, менять я его не собираюсь" - таким образом модуль разбирающийся с тем какой класс от кого зависит - просто выполнит инструкцию new ЧтоТо() и подкинет параметры (рекурсивно) которые ты указал. Это могут быть вещи которые ты явно укажешь в конфиге, а могут быть точно такие же модули, как тот, который сейчас собирается.

То есть управляшка зависимости создает обьект, читая его конструктор, и пытается по указанным типам данных подкинуть туда то, что можно создать. Что создать нельзя - она ругается, дескать - укажи это в конфигурации или передай вручную в момент создания. Но так как в симфони не принято создавать обьекты и обращаться к управляющему зависимостями напрямую - оно работает само, а если какой-то параметр заполнить нечем - ругается.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
WEBINAR Москва
от 190 000 руб.
Homeapp Москва
от 180 000 руб.
Skyeng Москва
от 150 000 до 250 000 руб.
11 дек. 2019, в 21:40
50000 руб./за проект
11 дек. 2019, в 21:29
80000 руб./за проект
11 дек. 2019, в 19:37
150000 руб./за проект