5

我正在构建一个 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如果我愿意,可以使用类似内容节点的模块。

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

Kohana 框架决定实现一个 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

接受 Kyles的建议,我决定所有控制器都需要一个路由集,它允许我定义 URL 路径“forum/topic/view/34”上方的哪些类路由。毕竟,每个 URL 都很重要,不应基于您现有的文件系统结构。我相信他说 URL 设计比我们通常给予的更多关注是正确的。

4

2 回答 2

4

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

它被称为路由,这就是解决方案。

在我浏览的最后 20 个框架中,它们似乎对这个普遍问题没有很好的答案

通用解决方案是路由。

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

于 2011-05-10T15:21:59.000 回答
0

我认为您可能过于关注“速度”——框架旨在加快开发速度,以便快速将想法摆在桌面上。

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

可能不是试图发明一些新的路由方法,而是应该有可用的工具来帮助轻松解决这个瓶颈,当且仅当它成为使用您的框架的人的问题时。

两种可能的解决方案是:

  1. 在内存或数据库表中动态缓存路由。
  2. 在文件中静态定义路由(我知道这是您不想做的)。
于 2011-05-10T15:52:15.873 回答