Доброго времени суток! Пишу простой интернет-магазин на своих велосипедах (для себя, в целях обучения и тренировки применения технологий/паттернов) и появилось несколько архитектурных вопросов, на которых застрял. Задача. Необходимо создавать объект класса (например, Core\Models\User) в точке входа приложения, а затем передавать его на все уровни приложения в обязательном порядке. Первое, что я сделал – добавил поле $user в синглтон-реестр. Но обращение через несколько уровней вверх по иерархии это совсем нехорошо – те же глобальные переменные, только в профиль. Потом ввёл простую зависимость – передавал $user вниз по иерархии, а в остальных классах принимал User $user как первый параметр (каждый метод контроллера принимал всегда User $user, а затем уже всё остальное). И всё было бы неплохо, если бы не понадобилось передавать ещё один параметр тоже на все уровни иерархии, но опционально (данные запросов post/get/ajax). Решение этой задачи тем же способом сделало из кода невнятную лапшу и необходимость рефакторить сотни мест при малейшем изменении. Вопрос: как лучше всего реализовать передачу данной зависимости? Спасибо! ps: Будет отлично, если с примерами. Читал статьи раз, два и ещё вот эту. Первые две подробны, но слишком сферические чтобы после середины понять как это работает, чем отличаются и зачем вообще нужно – к сожалению, я не смог их понять до той степени, чтобы начать использовать. Третья статья отличная и понятная, но как-раз на моменте с моей же проблемой происходит неведомая магия (используется библиотека Phemto) и всё, статья на этом заканчивается.
Читал эти статьи раньше, пересмотрел сейчас. На agiledev прекрасно объясняются задачи и термины. А вот на хабре статья про Phemto заставляет рыдать. Зачем делать так сложно? Какой-то головожопый монстр-паразит. Задача контейнера DI - ослаблять связи. Если коротко, то вместо Код (PHP): $car = new Limousine(); мы начинаем использовать Код (PHP): $car = $injector->create('Limousine'); и это позволяет вынести зависимость куда-то в другое место, скажем в "конфигурацию приложения". Теперь если мы повторно используем модуль где создается $car в другом приложении, не факт, что нам придется копировать туда еще и класс Limousine. TrogWar, тебя интересует как описывать эту "конфигурацию"? Или ты не уверен, что нужен именно контейнер, а не локатор, например? Поясни пожалуйста. Phemto смущает меня именно способом описания конфигурации. На кой черт здесь нужна рефлексия и 101 метод настройки! Требуется тупо задать связку имя => вызов конструктора. Чем проще описана эта связка, тем лучше, тем меньше непроизводительные накладные расходы.