Давайте определимся с тем что есть контроллер. Контроллер это какой-то компонент который управляет пользовательским вводом/выводом и на основе оного решает что делать собственно. В контексте WEB это некая штука, которая на вход принимает запрос а на выход должна вернуть ответ.
Если говорить в контексте ООП - у вас может быть один класс контроллер на запрос/страницу. И таких классов может быть бесчисленное множество. У вас может быть иерархия контроллеров. Да что угодно может быть.
Если вы хотите сделать расширяемую и главное удобно расширяемую логику - посмотрите в сторону dependency injection и аннотаций. Правда учитывая специфику запроса о чем-то хорошем наверное стоит просто забыть. Если хотите написать еще одну CMS - могу дать пару забавных идей. Так хоть CMS будет отличаться от миллионов существующих.
Но если отвечать на поставленный вопрос - проблема решается композицией классов, рефлексиями и ресолвом нужного метода в массиве контроллеров. По хорошему за это должен отвечать маршрутизатор запросов а "плагин" должен просто регистрировать маршрут либо подписываться на какие-то системные ивенты.