这是MVC中的业务逻辑还是视图?

时间:2012-08-06 00:04:58

标签: php model-view-controller

关于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++;
       }

4 个答案:

答案 0 :(得分:1)

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

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

关于模型或视图应该做的事情的一些通用的,简化的例子:

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

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

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

答案 1 :(得分:0)

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

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

事务脚本传输业务逻辑,您不需要对视图或模型进行大量推测,只需将所有内容保留在事务脚本中即可。

您的事务脚本往往会成为意大利面条代码,但是,随着时间的推移,您应该能够减少重复代码,并且我认为您的应用程序不会变得那么大,以至于它实际上是不可行的更长时间保持在事务脚本中。

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

答案 2 :(得分:0)

以Rails或CakePHP为例,您的代码不遵循mvc模式。

  • 模型应该只包含业务逻辑(查询/对对象的字段执行某些操作)
  • 控制器应“仅”接收带有参数的网页请求,并发送回正确的页面
  • 查看基本上只是一个html页面

很明显,这是关于HTML是什么的简短介绍。

在你的情况下,想法是:

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

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

之类的东西

视图将是这样的:                                           类别/显示/“&GT;';                                               类别/显示/“&GT;';                              

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

基本上你需要3个文件(逻辑分割),法则很简单:不要在Controller中编写html,也不在模型中编写。

答案 3 :(得分:0)

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

控制器实例是处理用户请求的实例,并且可以更改视图实例的模型状态。

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

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

这些模式大多可通过 *视图从模型层获取信息来区分。主要选项是:Model2 MVC,MVP,MVVM和HMVC。


在您的情况下,视图应从模型层获取类别集,然后,如果列表不为空且未抛出异常,请选择生成未排序HTML列表的模板。

业务逻辑将保留在模型层(在域对象中,处理类别),视图中的表示逻辑以及将所有内容都转换为HTML的过程中 - 在模板中,选择哪个视图。 / p>