Не знаю как правильно, но я размещаю так:
— логика приложения (она же системная): роутинг, логи, проверка параметров, прав, сохранение и получение данных (вызов всяких load и save), обработка форм, выбор способа отображения (html, xml, json, редиректы, ...), кэширование и т. п. — контроллеры (включая фронтконтроллер)
— логика модели (она же бизнес-логика): действия с данными без учёта их способа хранения (выставить или оплатить счёт, атаковать кого-то или построить здание) — как не странно, модели
— логика отображения: вывести сообщения системы (если они есть, формируются в контроллерах) раскрасить по разному чётные и не чётные строки таблицы, вывести дополнительные блоки (как правило для сайд-баров через вызов других контроллеров) — отображения (шаблоны)
То есть получается, что в модели сосредоточен код, который ничего не знает ни о http-запросах и ответах, ни о БД (или другом способе хранения). Контроллеры просто создают объекты модели, заполняют их, если нужно, данными из хранилища/запроса, вызывает, если требуется, методы модели, и если состояние объектов модели изменилось сохраняет их, после чего передаёт объекты в нужное отображение. Если приложение простое (только CRUD действия), то в модели вообще нет методов, кроме геттеров/сеттеров/делетеров (а иногда и их нет, только данные)