以下是您必须考虑的几件事:
- 你不能在 PHP 中做经典的 MVC。相反,我们有受 MVC 启发的模式
- 为 Web 实现时,视图和控制器实例之间存在 1:1 的关系
- MVC 中的模型不是一个类。它是一个层,包含许多不同的类
- View 不是一个愚蠢的模板,而是一个类的实例,它处理表示逻辑
在基于 Web 的 MVC 中查看
如上所述, MVC 和受 MVC 启发的模式中的视图负责表示逻辑。这包括显示错误消息和分页等内容。为此,每个视图可以处理多个模板。
View 从模型层接收信息,并采取相应的行动。来自模型层的信息如何最终出现在视图中的方式是 MVC 模式中最显着的差异之一:
经典的 MVC模式
当模型状态改变时,模型层的结构将信息发送到视图。这是通过观察者模式完成的。
Model2 MVC和HMVC模式
View 可以直接访问模型层,并能够从中请求信息。这是最接近原始模式的。
MVVM和MVP模式
View 通过控制器接收信息,控制器又从模型层请求它。模式的进一步差异源于在将数据传递给视图之前对数据的处理方式。
您现在似乎拥有的实际上只是一个模板。与本文中描述的一个类似。你最终得到一个结构,它没有地方包含表示逻辑。从长远来看,这将导致表示逻辑被推入控制器。
那么那个“欢迎”信息呢?
为了显示欢迎信息,您的视图应该从模型层请求当前用户的名称。如果模型层返回某种错误状态,查看选择错误消息模板并插入到布局中。
如果从模型层检索到用户名没有问题,请查看选择包含问候语的模板,在模板中设置值并呈现它。
应按什么顺序装载零件?
控制器应该初始化模型和视图的想法来自对 Web 的 MVC 的非常原始的解释。模式称为页面控制器,它试图将 MVC 直接嫁接到静态网页上。
在我看来,这应该是顺序:
模型
您初始化结构,通过它您将处理模型层。它很可能是某种服务工厂,它可以让您构建诸如Authentication
登录Library
服务和处理文档服务之类的东西。像这样的东西。我之前对模型层的结构写了有点长的评论。你可能会发现它很有用。
看法
您根据从路由机制收集的信息创建视图实例。如果您正在实现Model2或HMVC,那么您的视图将需要构造函数中的Service Factory实例。
如果您正在实现MVVM或MVP,那么视图的构造函数没有特殊要求。
控制器
这是您创建的最后一个结构,因为控制器负责将命令发送到视图层和模型层,然后更改然后更改两者的状态。因此控制器应该期望在构造函数中同时接收视图和服务工厂。
在初始化 MVC 的基本元素之后,调用控制器上的方法,并渲染当前视图。
请记住,这是非常简化的描述。