Как вы могли бы структурировать и маршрутизировать модули в MVC? - PullRequest
5 голосов
/ 10 мая 2011

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

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

Я хотел бы найти решение этой проблемы, которое не включает предварительно заданные пути

Это называется маршрутизация , а - решение.

из последних 20 фреймворков, которые я просматривал, похоже, они не дают хорошего ответа на эту универсальную проблему

Универсальное решение - маршрутизация.

Именно поэтому фреймворки используют его. Маршрутизация - это способ сохранить вашу архитектуру, сохраняя при этом гибкость с вашими URI. В противном случае имя вашего URI всегда должно соответствовать макету MVC.

0 голосов
/ 10 мая 2011

Я думаю, что вы, возможно, слишком озабочены «скоростью» - фреймворки предназначены для ускорения разработки, для быстрого выкладывания идей на стол.Популярный разработчик может затем попытаться устранить узкие места, чтобы повысить производительность.Очень редко веб-сайты попадают в точку, где им необходимо устранить узкие места дискового ввода-вывода, но если они это делают, у большинства фреймворков есть простое решение, которое заключается в статическом определении маршрутов в файле.

Возможно, вместопытаясь изобрести какой-то новый метод маршрутизации, вы должны вместо этого иметь инструменты, которые помогут легко устранить это узкое место, когда и только тогда, когда это становится проблемой для кого-то, использующего вашу среду.1008 *

Динамическое кэширование маршрутов либо в памяти, либо в таблице базы данных. Определение статически маршрутов в файле (я знаю, что вы этого не хотите).
...