【问题标题】:Module vs. Controller模块与控制器
【发布时间】:2011-03-02 07:19:02
【问题描述】:

我正在为一个(哦,不,另一个)PHP 框架编写一些零碎的东西,作为一种学习体验,并希望将来在较小的项目中使用。

我已经阅读了相当多的内容,即现有框架的参考文档。我经常看到Module这个词,根据我的阅读和以往的经验,Module 是一个用于划分相关代码(视图、控制器、模型等)的概念

我很好奇,在这种情况下,SO 是如何看待 Module 的? (上下文是 MVC Web 应用程序架构,或类似的应用程序开发模式)

我正在尝试确定如何最好地应用它,因为(我相信)它符合我目前的困境。对于音乐网站,模块将被视为ArtistProducer 等,而控制器将是ProfileMedia 等。这当然会留下操作,例如View,或Edit.

这一切看起来都不错,因为现在我可以像这样进行路由:

'Artist/Profile/View/{ALIAS}'
    +- Module : Artist
    +- Controller : Profile
    +- Action : View

//this may be accessed via music.com/artist/{alias}
//defaulting the Controller and Action

..但我试图弄清楚 Module 概念如何适合这里,特别是我将如何组织或修改我的控制器以适应。


这是我正在考虑的文件系统布局;

+- Root
    +- 'index.php'
    +- 'api.php'
    +- Modules
    |   +- Public
    |   |   +- Controllers
    |   |   +- Views
    |   |
    |   +- User
    |   |   +- Controllers
    |   |   +- Views
    |   |
    |   +- Artist
    |   |   +- Controllers
    |   |   +- Views
    |   |
    |   +- Producer
    |   |   +- Controllers
    |   |   +- Views
    |   |
    |   +- Venue
    |   |   +- Controllers
    |   |   +- Views
    |   |
    |   +- Administrator
    |       +- Controllers
    |       +- Views
    |
    +- Models
    +- Config
    +- ...

【问题讨论】:

  • 有些人会因为你在重新发明轮子而劝阻你,但我强烈鼓励你。如果我们永远不会打开玩具,我们怎么会知道“它是如何工作的”?下一步是制作自己的玩具版本。祝兄弟好运。
  • 感谢 Imran Naqvi;我在 SO 和其他地方看到了很多挫败感,尤其是在“重新发明框架”方面,虽然有些批评有时似乎适用,但如果我没有重新发明所有的东西,我永远不会理解我现在所理解的一半。我重新发明了:) 不过,我看不出很多负面反馈的原因。人们担心什么,太多的框架?我认为高效生产系统应该信任高效生产框架,但这不是踩别人学习的借口。看到鼓励真是令人耳目一新。

标签: php model-view-controller routing module


【解决方案1】:

模块(在 CakePHP 中称为插件)在大多数框架中都是非常迷你的应用程序。它们内部有自己的 MVC 结构,通常是自包含的,可能只依赖于主要的应用程序模型来保持代码的可重用性。

我们在工作的地方使用 Zend,模块的例子是

  1. 站点管理员对系统进行更改的管理模块。
  2. 网站通用前端的 Web 模块
  3. 登录用户的用户模块,他们有额外的管理工具来在网站上执行他们的活动

基本上所有这些都属于同一个站点/系统,但主要以非重叠方式处理。

【讨论】:

  • 感谢 JohnP; 这似乎与我的理解相似,但是,我正试图弥合逻辑鸿沟,将其应用于我的设计。根据活动的模块,不同的工具可用(就像在 Zend 示例中一样)是有道理的。将模型与模块堆栈分开似乎是一种很好的做法,以允许系统范围内访问数据源,不是吗?
  • 是的。我们通常从主项目访问模型。我们还将一些东西保存在与 Zend 具有相同层次结构的单独库文件夹中,以便保持中心位置。
  • 太好了,谢谢JohnP;我可能会接受你的回答,但是我会让这个问题坐下来,希望其他人能做出贡献/扩展。请随时在此处分享您认为相关的任何其他信息;我将更彻底地阅读 Zend 框架。
  • 酷。您还可以阅读 HMVC。 Codeigniter 有一个出色的 HMVC 插件,我使用它可以让您轻松地在项目中插入和删除模块。使事情变得非常模块化:net.tutsplus.com/tutorials/php/…
【解决方案2】:

在最简单的情况下,模块将是您应用程序中的一个文件夹(最好在预先确定的位置,例如/modules)。然后,您将在每个模块中拥有一个完整的 MVC 堆栈,共享库和框架本身位于顶层。

【讨论】:

  • 感谢 abesto; JohnP 的回答和你的回答似乎相互扩展。为每个模块创建新的 MVC 堆栈是有意义的,但是(如果您有不同的感觉,请纠正我)正如我之前评论的那样,在这里排除模型似乎是一种更好的做法,以确保系统范围内的可访问性。我正在实现一个模型/方法驱动的 ACL 检查点,因此无论模块->控制器与模型对话如何,只有允许的会话才会得到任何反馈。
  • 这是一个应该在每个项目的基础上回答的决定。例如,在我当前的项目中,不同的模块可以在不同的服务器上,通过 JSON-RPC 相互通信。在这种情况下,将模型放置在模块级别是一个明显的选择。你的推理同样正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2019-07-21
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多