geralmente é bom separar as responsabilidades (separation of concerns).
O controller deve lidar um pouco mais com mandar executar alguma lógica e redirecionar para outras lógicas.
Quem executa de verdade essas lógicas deveria ser algum componente que vc recebe no construtor do controller
maior_abandonado
Ai agente pensa na responsabilidade do controller… o que você está fazendo com IO está diretamente ligado a verificar qual modelo usar ou, de acordo com a resposta do modelo direcionar a uma ou outra view?
Acredito que a melhor forma seria você encapsular isso em uma classe de modelo e chamar um objeto disso para executar este processamento…