我确定有人已经发布了这个问题;但是,我想在PHP上获得MVC的所有建议。我知道有很多专家愿意与那些对编码最佳实践有疑问的人分享他们的知识。
希望这可以帮助那些人(因为它肯定会帮助我)。
答案 0 :(得分:39)
MVC是最容易被误解的设计模式。根据定义,有一个模型。
当城市规划师提出项目时,他会为此设计一个模型。模型可能包含的独立实体:建筑物,街道,公园,通常不是由单独的模型表示的:它们是单个模型的所有方面。
因此在MVC中,模型可以由不同的实体组成,这可能是它的最佳词:实体,就像在数据库表所代表的实体中一样。 MVC中的模型甚至可能比代码中实际表示的更抽象,而是应用程序可能需要对其执行的所有数据的概念保护。
考虑到这一点,如果这些实体有自己的方法,特别是可能与CRUD(创建,读取,更新,删除)方面相对应的方法,它们应该不直接暴露给控制器,它的抽象程度太低了。这些构建块应该构建为粗粒度的接口,例如,您可以删除记录,但在删除后返回记录列表。控制器只需要访问执行上述所有操作的粗粒度方法。
此外,要将实体的方法直接暴露给控制器,如果有关于什么ORM(对象关系映射)系统的更改,则可能导致控制器必须与实体类一起被重写正在使用。我建议的中间层也是异常处理,日志记录以及任何其他需要管理的管理员的好地方。
更高抽象级别的建议方法层有时被称为业务委托,或称为“外观”,但这是我实际上认为的模型。希望这不是太理论化,对OP或其他读者有帮助。
答案 1 :(得分:3)
我发现该博客与您的问题相关。
博客作者汤姆巴特勒指出大多数MVC框架允许model-view
交互的方式不正确并试图解释 在MVC中,视图应该直接访问模型 强大>使用一些例子。
他有一个有效的观点,但是
来自Rails背景我发现很难理解view
直接访问model
的想法。
答案 2 :(得分:1)
对于php,我喜欢使用CodeIgniter框架。它奠定了MVC设置的基础工作。控制器保存在“/ controllers”中,模型位于“/ models”
中我认为控制器应该调用模型,模型应该尽可能地封装,如果需要的话使用子方法。这使您的代码更具适应性和灵活性。例如,今天您的模型正在从本地数据库读取,明天您可以从REST服务中读取。模型应该将数据返回给控制器,控制器应该对模型内部的内容很幼稚。
答案 3 :(得分:0)
我不确定“组织”是什么意思。
控制器调用它需要的任何模型,以便将信息传递给视图[s]。它(控制器)可以对模型进行多次调用以获取不同的信息。
答案 4 :(得分:-1)
MVC的秘密在于" M" MODEL应该创建并设计为VIEWMODEL,而不是简单的模型。
让我们说下一个例子:当插入一个名为Customer的实体时,我们有一个表单:
客户
MVC规则说我们应该将Customer MODEL发送到View。 但是,让我们说Country字段中填充了一个组合框。然后,我们应该向VIEW发送国家列表。
所以,我们将有下一个VIEWMODEL
CustomerViewModel
此外,通常表单不像字段那么简单,仅此而已,它有按钮,标签/消息框等。它应该在VIEWMODEL中建模