Meus dois centavos aqui:
Estou refatorando um aplicativo php e estou tentando fazer o máximo possível de injeção de dependência
Você não informa se está usando uma estrutura de injeção de dependência. Eu acho que você definitivamente deveria. Use algo que ofereça os recursos necessários: /programming/9348376/guice-like-dependency-injection-frameworks-in-php .
O problema que encontrei agora é em que ponto posso realmente criar novos objetos? Parece que vou terminar em uma classe de nível superior, criando muitos objetos novos, pois não há mais para onde ir. Isso parece errado.
Você normalmente usa a configuração ou um ponto central para a instanciação dos objetos iniciais que compõem seu aplicativo. O contêiner criará os objetos para você.
Você acessa objetos (serviços, provedores, controladores ...) por meio do contêiner de IoC. Ele criará um objeto de forma transparente, se necessário, ou fornecerá uma referência à instância existente apropriada.
Obviamente, dentro de sua implementação específica de objetos, você pode instanciar outros objetos nos quais não precisa de DI (estruturas de dados, tipos personalizados, etc.), mas isso é programação normal.
Li alguns blogs que usam classes de fábrica para criar todos os objetos e você injeta a fábrica em outras classes. Você pode chamar os métodos de fábrica e a fábrica cria o novo objeto para você.
Normalmente, você usa um Factory se deseja que a estrutura de IoC instancie alguns objetos de IoC através de suas fábricas (isso é necessário ao instanciar um objeto em particular, requer algum trabalho extra). Se você pode simplesmente criar seus objetos com "new Object ()" e definir algumas propriedades, não necessariamente deseja usar um padrão de Fábrica.
Em outras palavras, eu diria que o uso de um padrão Factory para uma classe ou grupo de classes depende de como você deseja modelar essas classes, não de usar DI (a menos que sua implementação de DI exija explicitamente fábricas, o que é incomum).
Você também configura sua estrutura de IoC para usar um Factory quando estiver usando uma biblioteca de terceiros que já exija o uso de um Factory. Nesse caso, você não tem controle sobre isso e precisa informar ao seu contêiner de IoC: "ei, quando solicito uma dessas interfaces, você deve usar esta fábrica para fornecer uma instância apropriada".
Minha preocupação em fazer isso agora é que minhas aulas de fábrica serão uma nova opção para todos! Eu acho que isso pode ser bom, pois são classes de fábrica, mas existem algumas regras a serem seguidas ao usar o padrão de fábrica e o DI, ou estou indo muito longe aqui.
Nesse caso, parece que você não precisa usar padrões de fábrica para esses objetos / serviços / controladores / o que quer que seja, e você pode simplesmente configurar sua IoC para instanciar com "nova" a classe apropriada e injetar todo o resto.
Espero que ajude.