视图中不可避免的php逻辑(MVC)插入产品并显示消息


Unavoidable php logic in view (MVC) Inserting a product and showing a message

基本上我有一个用于插入产品的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有模型层的原因。

当您提交表格时,操作顺序应如下:

  1. 控制器接收带有$_POST数据的请求

  2. 控制器将信息发送到模型层

    • 如果数据有效,模型层将保存信息
    • 如果数据无效,模型层将设置并获取错误状态并保存(通常在会话中)

  3. 控制器通知当前视图有POST发送的

  4. 当视图被请求生成响应时(最好不是由控制器),它会发送一个Location HTTP头(以防止重复发布)

  5. 控制器接收到新的请求(这次只有GET参数)

  6. 如果需要,控制器调整模型层和当前视图的状态

  7. 视图询问模型层是否包含错误状态

    • 如果存在错误状态,查看请求模型层的错误代码列表,并根据该信息选择使用哪些模板来组成包含"错误"消息的表单
    • 如果模型层中没有错误状态,视图将使用模板创建"成功"消息

在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
}

是这样的吗?