Я бы предложил строить их как компоненты, но это можно сделать другими способами.
Мне пришлось сделать нечто подобное, когда я построил CMS с дополнительными модулями. Чтобы заставить его работать логически, мне пришлось немного повернуть MVC с ног на голову и пойти на очень тонкий контроллер . По сути, логика интерфейсного модуля содержалась полностью на уровне модели со связанными представлениями в качестве элементов. Модуль помощник извлек и отобразил модуль в общедоступном интерфейсе. Бэкэнд обрабатывался обычным образом через MVC с обычным контроллером ожирения.
Как выяснилось, модели были удивительно легкими, и в них все было в качестве элементов, что сделало юзабилити мечтой.