【发布时间】:2011-08-22 13:51:27
【问题描述】:
我正在构建一个一切都是模块的 MVC。这将允许我分离诸如论坛和用户模块之类的对象集合,以进一步组织我的 MVC。
/blog
/controller
/model
/view
/user
/controller
/model
/view
/forum
/controller
/model
/view
我目前将forum/edit/34 之类的路线映射到包含Forum_Controller_Edit 类的/forum/controller/edit.php。 (这与标准方法略有不同,其中所有操作都是控制器 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 “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
采用Kyles advice 我决定所有控制器 将需要一个路由集,它允许我定义 URL 路径“forum/topic/view/34”上方的哪些类路由。毕竟,每个 URL 都很重要,不应基于您现有的文件系统结构。我相信他说 URL 设计比我们通常给予的更多关注是正确的。
【问题讨论】:
标签: php model-view-controller frameworks modularity file-structure