如何在 MVC 中构建和路由模块


How could you structure and route modules in a 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)我将不得不使用像 /topic/view/ 这样的 URL 而不是 forum/topic/view ,2) 我会分离相关组件(主题应该是论坛模块的一部分),以及 3) 如果我愿意,我现在将无法为内容节点之类的东西创建一个通用的"主题"模块。

那么,如何在每个模块中允许多个控制器(具有多个操作)的同时构建模块化 MVC?

Kohana Framework决定实施HMVC来解决这个问题。但是,这会导致许多 is_file() 检查以查找要加载的文件的正确位置。I/O 检查在商用硬件上非常珍贵,所以我不认为这是一种选择。此外,加载的类版本并不明显,这在使用具有相同名称的多个类时会导致混淆。

我想找到解决此问题的方法,该解决方案不涉及预设路径或检查文件夹的正确类。然而,在我浏览的最后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设计值得比我们通常给予更多的关注。

我想找到一个解决方案 这个问题不涉及 预设路径

这就是所谓的

路由这就是解决方案。

在我查看的最后 20 个框架中 通过他们似乎没有一个好 这个普遍问题的答案

通用解决方案是路由。

这正是框架使用它的原因。路由是保留体系结构,同时仍具有 URI 灵活性的方法。否则,URI 命名将始终必须符合 MVC 布局。

我认为你可能太关心"速度"——框架旨在加快开发速度,快速将想法提出来。

一旦网站开发并上线,如果它变得流行,开发人员就可以尝试修复瓶颈以提高性能。 网站很少达到需要修复磁盘I/O瓶颈的地步,但如果他们这样做,大多数框架都有一个简单的解决方案,即在文件中静态定义路由。

与其尝试发明一些新的路由方法,不如说应该有可用的工具来帮助轻松解决这个瓶颈,当它成为使用你的框架的人的问题时。

两种可能的解决方案是:

  1. 在内存或数据库表中动态缓存路由。
  2. 在文件中静态定义路由(我知道这是您不想做的)。