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