Контроллер не должен в себе содержать логики, кроме извлечения вводимых пользователем данных, его обработки с помощью сервисов или моделей (на самом деле тут может быть какой угодно слой, вариантов масса) и ответа. В вашем случае есть два популярных подхода к решению задачи:
- MVC - логика здесь будет находится в основном в модели. Достаточно простой и очевидный способ для новичков в ООП.
- SOA (ссылка не очень удачная, но думаю смысл должен быть понятен) - способ для более опытных разработчиков, но и более гибкий и востребованный в больших приложениях со значительным сроком разработки и поддержки.
Для SOA вам действительно необходим будет DependencyInjection Container (или ServiceLocator), который новичкам достаточно сложно освоить. В MVC подходе все намного проще и очевиднее, поэтому рекомендую сначала попробовать его, а потом, когда упретесь в толстые модели, переходить к SOA и использовать сервисный слой.