Как можно структурировать и маршрутизировать модули в MVC?

Я создаю 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 "forum / topic / view / 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 заслуживает большего внимания, чем мы часто ему уделяем.

5
задан Xeoncross 14 May 2011 в 23:45
поделиться