基本上我有一个用于插入产品的html表单。字段名称以及$_POST变量在我的Product类中初始化。构造函数正在"监听"提交按钮。当用户提交表单时,对象的状态会更改为"就绪",这意味着它的属性已初始化并准备好插入数据库。
然后我需要根据插入的状态(成功或失败)返回一条消息,如果成功,我将打印类似"成功插入产品"的内容,如果失败:"检测到空字段"。
我的问题是,是否允许我把这种逻辑放在这个观点中?像这样:
<?php $myproduct = new Product(); ?>
<form>
<!-- Fields -->
</form>
<?php
if ($myproduct->ready()) :
if ($myproduct->insert()) : ?>
<p>Product inserted successfully</p>
<?php
else : ?>
<p>Null fields detected</p>
<?php
endif;
endif; ?>
我真的想不出更简单的方法了,因为我真的需要根据insert()的返回状态来显示消息。
那么MVC模式中是否允许在视图中混合这种逻辑呢?我不公开任何类型的业务逻辑,只是检查对象的状态。
否。域业务逻辑在视图中没有位置(在整个表示层中也没有位置)。这就是MVC有模型层的原因。
当您提交表格时,操作顺序应如下:
-
控制器接收带有
$_POST
数据的请求 -
控制器将信息发送到模型层
- 如果数据有效,模型层将保存信息
- 如果数据无效,模型层将设置并获取错误状态并保存(通常在会话中)
-
控制器通知当前视图有
POST
发送的 -
当视图被请求生成响应时(最好不是由控制器),它会发送一个
Location
HTTP头(以防止重复发布) -
控制器接收到新的请求(这次只有
GET
参数) -
如果需要,控制器调整模型层和当前视图的状态
-
视图询问模型层是否包含错误状态
- 如果存在错误状态,查看请求模型层的错误代码列表,并根据该信息选择使用哪些模板来组成包含"错误"消息的表单
- 如果模型层中没有错误状态,视图将使用模板创建"成功"消息
在Model2MVC模式中会有表单提交的操作顺序。
根据您是否在与表单本身相同的视图中显示错误消息和/或成功消息,视图实例可能会在STEP4中检查模型层的错误状态。然后视图可以决定发送哪个Location
头。
附言:与模型层的交互很可能通过服务进行。
如果我是你,我不会在视图中这样做。在逻辑中执行此操作并设置布尔值。该值可以在对象本身上,也可以直接传递到视图中。
$isInsertedSuccessfully = $myproduct->insert();
或者,在产品的内部工作中,添加一个方法来测试是否已插入。例如:
$myproduct->insert();
if ($myproduct->exists())
{
//true - must have been inserted
}
或
$myproduct->insert();
if ($myproduct->isSaved())
{
//true - must have been inserted
}
是这样的吗?