Такой маршрутизатор писали наверное все :) Вот например на хабре статья была хорошая —
habrahabr.ru/post/150267
А по делу мне стало интересно пару моментов:
— зачем нужно определять $viewFile?
— у вас используется именование классов controllerName? А почему не CamelCase?
— зачем всегда делать исключение и выдавать ошибку? Почему не вызвать 404?
— роутер разбирает только 3 уровня вложенности? /url1/url2/param. А если уровней больше? Например /admin/blog/edit/2.
— у вас обязательно использование модели. А модели может и не быть. Например SiteController отображает статические страницы и не имеет модели.