Мои два цента здесь:
Я рефакторинг PHP-приложения, и я пытаюсь сделать имеет много инъекций зависимостей, насколько это возможно
Вы не заявляете, используете ли вы среду внедрения зависимостей. Я думаю, что вы определенно должны. Используйте то, что дает вам необходимые функции: /programming/9348376/guice-like-dependency-injection-frameworks-in-php .
Проблема, с которой я сейчас столкнулся, заключается в том, в какой момент я могу создавать новые объекты? Похоже, я попаду в класс верхнего уровня, создавая множество новых объектов, так как больше некуда идти. Это неправильно.
Обычно вы используете конфигурацию или центральную точку для создания экземпляров исходных объектов, составляющих ваше приложение. Контейнер создаст объекты для вас.
Затем вы получаете доступ к объектам (сервисам, поставщикам, контроллерам ...) через контейнер IoC. При необходимости он прозрачно создаст объект или предоставит ссылку на соответствующий существующий экземпляр.
Конечно, внутри вашей конкретной реализации объектов вы можете создавать экземпляры других объектов, для которых вам не нужен DI (структуры данных, пользовательские типы и т. Д.), Но это нормальное программирование.
Я читал некоторые блоги, которые используют фабричные классы для создания всех объектов, а затем ты вводишь фабрику в другие классы. Затем вы можете вызвать фабричные методы, и фабрика создаст для вас новый объект.
Обычно вы используете Factory, если хотите, чтобы инфраструктура IoC создавала экземпляры некоторых объектов IoC через ваши фабрики (это необходимо, когда создание экземпляра конкретного объекта требует дополнительной работы). Если вы можете просто создавать свои объекты с помощью «new Object ()» и устанавливать некоторые свойства, вам не обязательно использовать шаблон Factory.
Другими словами, я бы сказал, что использование шаблона Factory для класса или группы классов зависит от того, как вы хотите моделировать эти классы, а не от того, используете ли вы DI (если ваша реализация DI явно не требует фабрики, что необычно).
Вы также настраиваете свою инфраструктуру IoC для использования Factory, когда вы используете стороннюю библиотеку, которая уже требует использования Factory. В этом случае у вас нет контроля над этим, и вам нужно сказать вашему контейнеру IoC: «эй, когда я запрашиваю один из этих интерфейсов, вы должны использовать эту фабрику, чтобы предоставить мне соответствующий экземпляр».
Моя забота о том, чтобы сделать это, теперь мои фабричные классы станут новыми бесплатными для всех! Я думаю, это может быть нормально, так как они являются фабричными классами, но есть ли какие-то правила, которых нужно придерживаться при использовании фабричных шаблонов и DI, или я иду далеко от цели.
В этом случае звучит так, что вам не нужно использовать шаблоны Factory для этих объектов / служб / контроллеров / чего бы то ни было, и вы можете просто настроить свой IoC для создания экземпляра с помощью «нового» соответствующего класса и внедрения всего остального.
Я надеюсь, что это помогает.