小编use*_*011的帖子

如何在 MVC 框架中有效地实现模块,并在单个模块中处理到多个控制器的路由?

我开发了一个基本的 MVC 框架作为 php 的学习项目——这实际上是它的第二个版本,我正在尝试改进第一个版本不足的两个方面:

  • 请求路由:映射请求,例如/controller/action/[params]
  • 模块:旨在扩展应用程序的嵌入式应用程序,例如 CMS。

这就是我现在所处的位置:

  1. 我能够接受请求并将其解析为各个部分,例如控制器、操作、参数等。这些映射到相应的控制器类/文件,例如“/foo/bar”-> FooController::bar() - 所有这些都是在我的 RequestRouter 类中完成并封装在 Request 对象中。

    • 我维护一个 Manifest 对象,其中包含对应用程序文件的分类引用(控制器、lib 等)。我的自动加载器方法使用该清单。
    • 由于清单已被缓存,因此每当我添加新文件/类时都会重新构建清单,这对于添加/删除新模块时是正确的。
  2. Controller::methods() 可以很好地呈现正确的视图。

  3. 然后是模块,它们的组织方式就像核心的结构一样(/root/raspberry/vendors/core/module)

问题

我认为我目前遇到的问题是涉及模块的路由/请求处理的组合:

  • 如果我请求project.dev/admin,它会映射到 AdminController::index() ——这是正确的
  • 但是,当我引用 project.dev/admin/editor 时,我仍然得到AdminController::editor(),我真正想要的是EditorController::index()

经过一番研究,我认为我可以创建一个Decorator,它实现Front Controller模式并包装给定的 Controller。装饰器可以重新解析请求以使 /editor 成为控制器并重新映射剩余的段 (/editor/action/args)。

所有这些看起来都可以正常工作,但我觉得我错过了流程早期的一些基本内容(RequestRouter)。我在 SO 中研究了其他类似的问题,并阅读了 HMVC,原则上它似乎可以回答我的问题,但它似乎更多是接口驱动而不是框架驱动(如果这有意义吗?)还研究了 Kohana 等其他框架,但我不太清楚它们的模块系统以及到同一模块中多个控制器的路由是如何工作的。

任何关于如何在不引入前端控制器或重新解析请求的情况下有效实现模块系统的见解或建议将不胜感激。或者,如果我应该以不同的方式重新构建我的模块,我想了解如何做到这一点。

附加信息:

我的 RequestRouter 维护着我预定义的路由列表(包括它们的默认方法)。使用这些预定义的路由,我可以访问 /admin/editor 并获取 EditorController::index(),但我必须为每个控制器定义一个路由,并请求发送到模块中的控制器。我认为这不是一个好的设计。这是我的路线示例:

Array
(
    [/foo] => Array
        (
            [controller] => FooController
            [method] => bar
            [path] => /core
        ) …
Run Code Online (Sandbox Code Playgroud)

php model-view-controller design-patterns module vendor

5
推荐指数
1
解决办法
2746
查看次数