【问题标题】:How could you structure and route modules in a MVC?如何在 MVC 中构建和路由模块?
【发布时间】: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


    【解决方案1】:

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

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

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

    通用的解决方案是路由。

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

    【讨论】:

    • 也许你的权利。我猜大多数网站都会通过将“/blog/view/Hello-World”更改为“/writes/Hello-World”或出于 SEO 目的来摆弄 URI 命名。我只是更喜欢“约定优于配置”,因为为您添加的每个控制器设置新的重写很麻烦。另外,如果你在它们中使用正则表达式,它也会让你的系统变慢一点。所以这里有一个问题要问你。我将如何为这样的事情设置路线?如何将“论坛/主题/视图”路由到匹配的控制器,同时仍将“论坛/编辑”路由到它的控制器?
    • 您的系统应该自动将传入的 URI 重写到其相应的控制器。只有异常需要显式路由。您可以使用.htaccess 文件甚至 PHP 进行路由。我对您的特定系统的详细信息了解得不够多,无法知道实施它的最佳方式。
    • 我在问题的底部添加了一个示例以帮助澄清。
    【解决方案2】:

    我认为您可能过于关注“速度”——框架旨在加快开发速度,将想法快速提出来。

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

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

    两种可能的解决方案是:

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

    【讨论】:

      猜你喜欢
      • 2023-03-18
      • 2013-04-12
      • 1970-01-01
      • 2010-09-13
      • 2020-09-18
      • 1970-01-01
      • 2018-03-14
      • 2018-08-07
      • 2012-04-18
      相关资源
      最近更新 更多