【问题标题】:Is this business logic or views in MVC?这是 MVC 中的业务逻辑还是视图?
【发布时间】:2012-08-03 00:07:16
【问题描述】:

这里有关于 MVC 结构的新手问题。因此,在 MVC 中,我目前在视图中有一个页面来显示数据库查询的结果列表,在这段代码中,我实例化了一个类,运行 sql 查询方法,最后每个循环都有一个然后用 div 显示它。

所以我的问题是,如果这段代码被认为是业务逻辑并且应该在模型中的方法中,还是它是视图的一部分?

希望你明白我的意思 =) 谢谢!

$listholder = new Categories_Model(); 
$data = $listholder->getCategories();

       $i = 1;
        foreach ($data as $row) {

            if ($i & 1) {
                echo '<div id="horizontalContainer" style="float: none; height: 50px";>';
                echo '<div id="listoverview1"><a href="'.URL.'categories/show/'.$row['id'].'">'.$row['catname'].'</a>';
                echo '</div>';
            } else {
                echo '<div id="listoverview1"><a href="'.URL.'categories/show/'.$row['id'].'">'.$row['catname'].'</a>';
                echo '</div></div>';
            }

            $i++;
       }

【问题讨论】:

    标签: php model-view-controller


    【解决方案1】:

    根据您的问题,您可能对 MVC 有所了解,这与其他开发人员认为 MVC 是什么无关。这可能会发生,尤其是现在,因为一些框架将这三个字母用作标语,但实际上并未提供。

    根据您在问题中概述的代码,我想说这是典型的Transaction Script,并且没有涉及特定类型的模型或视图层。

    事务脚本传输业务逻辑,您无需过多推测视图或模型,只需将所有内容保留在事务脚本中即可。

    您的事务脚本往往会变成意大利面条式代码,但是,随着时间的推移,在这里和那里进行一些小的重构,您应该能够减少重复代码,我认为您的应用程序不会增长到实际上不可行的程度不再在事务脚本中维护它。

    那么,如果一切都与其他经过充分验证的模式井然有序,为什么还要关注 MVC?

    【讨论】:

    • 感谢您的回复!几年来我没有写太多代码,最近才重新开始,我认为学习 MVC 是一个好主意。因此,我按照指南创建了自己的 MVC,因为我认为这是学习基础知识的好方法。所以现在我正在继续这个“项目”并且该指南仅适用于非常基础的内容,我只是想确保我以“正确”的方式做事。我宁愿从一开始就做,然后不得不回去重新学习我之前误解的东西。
    • 为这段文字道歉,但我似乎不能换行哈哈。
    • 嗯,让我想想。可能这个问题和答案对你来说很有趣:Understanding MVC; How should a model be structured in MVC?
    【解决方案2】:

    以Rails或CakePHP为例,你的代码没有遵循mvc模式。

    • 模型应该只包含业务逻辑(查询/使用对象的字段做某事)
    • 控制器应该“仅”在接收带有参数的网页请求并返回正确的页面时工作
    • View 基本上只是一个 html 页面

    显然这是对 html 是什么的简短介绍。

    在你的情况下,这个想法是:

    $listholder = new Categories_Model(); 
    $data = $listholder->getCategories();
    

    这是一个控制器代码(通常),getCategories 是一个模型方法(可以)。 然后控制器将发送一些参数来查看,这些参数将知道如何向用户显示这些参数,在这种情况下是您的$data 变量。 想象一下printMyView($view_file_path, $data)

    视图将是这样的: 类别/显示/">'; 类别/显示/">';

    请参阅http://php.net/manual/en/control-structures.alternative-syntax.php 了解替代控制结构语法(非常好)。也许 URLS 用 sprintf 或类似的东西写得更好(不是我这样做的)。

    基本上你需要 3 个文件(逻辑拆分),而且规则很简单:不要在 Controller 中编写 html,也不要在 Model 中编写。

    【讨论】:

    • -1 为?任何解释为什么不正确的评论?我可以看到其他答案说同样的话,但没有得到 -1。
    【解决方案3】:

    MVC 设计模式的目标是将表示与领域业务逻辑分开。出于这个原因,业务逻辑只保留在模型层中(模型是一个层而不是任何单个类,如果你有一个名为 Model 的类,你做错了),整个表示层包含查看控制器。

    控制器实例是一种处理用户请求,并改变模型和视图实例状态的实例。

    视图实例是那些包含表示逻辑的实例(就像域对象包含模型层中的业务逻辑一样)。视图从模型层获取信息并决定将使用哪些模板,甚至是否需要模板。视图在您的网站中生成响应,发送 redirect header 也是一种响应形式,根本不需要任何模板。

    另外,你必须明白,在 PHP 中使用经典的 MVC 模式是不可能的(并且在少数 Web 开发中非常复杂和不切实际,这将提供这样的选项)。相反,您将使用一种受 MVC 启发的模式。

    这些模式主要通过如何*视图从模型层获取信息来区分。主要选项有:Model2 MVC、MVP、MVVM 和 HMVC。


    在您的情况下,视图应该从模型层获取一组类别,然后,如果列表不为空且未引发异常,则选择一个生成未排序 HTML 列表的模板。

    业务逻辑将保留在模型层(在处理类别的领域对象中),视图中的表示逻辑以及将其全部转换为 HTML 的过程 - 在模板中,选择哪个视图。

    【讨论】:

      【解决方案4】:

      不,该代码主要是视图代码。它的唯一目的是允许外部进程(人类)以它喜欢的形式查看数据。假设第一行的检查只对外部流程很重要,对您的业务逻辑不重要

      模型代码塑造、获取和设置数据,其中一些是持久化的(数据库等),其中一些是按需计算的

      一些关于模型或视图应该做的事情的概括和简化示例:

      • 模型计算一些财务数据的总和
      • 视图标记每个偶数行,以便在视图中使用阴影背景进行渲染

      此外,在经典 MVC 系统中,前两行代码将位于控制器中,控制器将通过使用模型和模型方法来组织数据集以获取数据。然后 MVC 系统将该数据传递给选定的视图进行渲染

      有很多基于 PHP 的 MVC 框架,如 CAKE、KISS 等(并非所有框架都非常好!)。如果您的口袋里有几美元,请节省一些时间和压力,并加载 Microsoft MVC

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多