Пример показывает как ложить и вытягивать зависимости в фреймворке. Ты можешь плясать через замыкания, но получится ещё хуже. Считай это мини-DI.
Ну и да, не нужно быть stackoverflow-driven developer be like “вижу туториал-код - тащу его в прод”.
У нас, к примеру, никаких запросов к БД прямо из HTTP-хэндлеров не ходит. Соотвественно, никакие пулы конекшнов к БД там вообще не фигурируют. У нас там просто прокидывается сервис, и уже ему отправляет команда/запрос (у нас там cqrs немного). Все пляски с пулами, если они надо, проходят под капотом сервиса уже.
И никаких проблем с загрязнением сигнатур нету. Это класический DI. Функция требует через параметры ровно то, что ей нужно для работы, не имея под-капотных скрытых зависимостей.