我开发了一个基本的 MVC 框架作为 php 的学习项目——这实际上是它的第二个版本,我正在尝试改进第一个版本不足的两个方面:
我能够接受请求并将其解析为各个部分,例如控制器、操作、参数等。这些映射到相应的控制器类/文件,例如“/foo/bar”-> FooController::bar() - 所有这些都是在我的 RequestRouter 类中完成并封装在 Request 对象中。
Controller::methods() 可以很好地呈现正确的视图。
然后是模块,它们的组织方式就像核心的结构一样(/root/raspberry/vendors/core/module)
我认为我目前遇到的问题是涉及模块的路由/请求处理的组合:
经过一番研究,我认为我可以创建一个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)