Я строю MVC, где все является модулем. Это позволит мне разделить коллекции объектов, таких как форум и пользовательские модули, для дальнейшей организации моего MVC.
/blog
/controller
/model
/view
/user
/controller
/model
/view
/forum
/controller
/model
/view
В настоящее время я сопоставляю маршруты для чего-то вроде forum/edit/34
до /forum/controller/edit.php
, который содержит класс Forum_Controller_Edit
. (Это немного отличается от стандартного подхода, где все действия являются методами контроллера Forum_Controller::edit()
). Это позволяет мне разделить все отдельные «действия» контроллера на их собственные файлы, поэтому я не нужно управлять большими контроллерами с 10 различными действиями.
В любом случае, здесь проблема. Предположим, я хочу добавить новые контроллеры в модуль. Например, допустим, я хочу иметь темы на форуме (forum/topic/view/34
). Я мог бы создать новый модуль "тема".
/forum
/controller
/model
/view
/topic
/controller
/model
/view
Но тогда 1) я должен был бы использовать URL вроде /topic/view/
вместо forum/topic/view
, 2) я бы разделил связанные компоненты (тема должна быть частью модуля форума), и 3) я бы сейчас не быть в состоянии создать общий «тематический» модуль для чего-то вроде узлов содержимого, если я хотел.
Так, как я могу построить модульный MVC, позволяя несколько контроллеров (с несколькими действиями) в каждом модуле?
Kohana Framework решил внедрить HMVC для решения этой проблемы. Однако это приводит ко многим проверкам is_file (), чтобы найти правильное местоположение файла, который вы хотите загрузить. Чеки ввода / вывода очень ценны на аппаратном оборудовании, поэтому я не рассматриваю этот вариант. Кроме того, неясно, какая версия класса загружается, что может привести к путанице при работе с несколькими классами с одним именем.
Я бы хотел найти решение этой проблемы, которое не предполагает предварительной установки путей или проверки папок на предмет правильного класса. Тем не менее, из последних 20 фреймворков, которые я просматривал, они, похоже, не дают хорошего ответа на эту универсальную проблему. У кого-нибудь есть идеи?
Обновление маршрутизации
Если бы я должен был реализовать маршрутизацию, как бы это работало? Как бы я справился с первым (/ forum), вторым (/ forum / view) и третьим уровнями (/ forum / topic / view)? Как мои маршруты узнают разницу между маршрутом третьего уровня и маршрутом второго уровня с параметром? Другими словами, что из этого попытается сделать моя система? (Учитывая URI "форум / тема / просмотр / 34")
$controller = new \Forum\Controller\Topic\View;
$controller->action('34');
// or
$controller = new \Forum\Controller\Topic;
$controller->view('34');
// or
$controller = new \Forum\Controller;
$controller->topic('view', '34')
Обновление маршрутизации 2
Принимая Совет Кайлса Я решил, что ВСЕМ контроллерам потребуется набор маршрутов, который позволит мне определить, какой из классов выше пути URL "forum / topic / view / 34 "маршруты тоже. В конце концов, КАЖДЫЙ URL важен и не должен основываться на имеющейся у вас структуре файловой системы. Я считаю, что он прав, говоря, что дизайн URL заслуживает большего внимания, чем мы часто уделяем ему.