DI-контейнер это один из основных инструментов который должен быть в вашем приложении. Одно из правил SOLID это инверсия зависимостей, которая решается внедрением DI-контейнера с Автовайрингом для удобства.
Уже много лет использую
https://container.thephpleague.com/ и работа с зависимостями перестала был проблемой.
Теперь по вашей задаче:
У вас есть контроллер HomeController который должен иметь две зависимости, например UserRepository и Pagination.
Какие зависимости должен иметь контроллер через абстракцию ? UserRepository потому что репозиторий это как правило класс который реализует слой хранения данных, который в свою очередь может меняться так как относится к слою инфраструктуры, поэтому у вас есть UserRepositoryInterface. Но вот к чему относится Pagination ? - к слою представления где у вас и находится контроллер, по сути использовать абстракции для него нет смысла, также как и для Response и Request и тд.
Поэтому ваш код будет выглядеть так:
class HomeCotroller{
public function __construct(protected Request $request, protected UserRepositoryInterface $userRepository)
}
public function index(): Response {
$params = $this->request->getAll()
//тут логика получения переменных
$pagination = new Pagination($param1, $param2);
$pagiationHtml = $pagitation->render();
//тут логика построения html через шаблонизатор
return new Response($html);
}
По поводу конфига с настройками: в DI контейнере есть возможность использовать singlitone объекты , создаете адаптер подключения к базе MysqlAdapter который в конструкторе берет настройки из вашего .env файла и создает соединение 1 раз. И дальше можете адаптер использовать его через инъекцию в ваши репозитории.