2

关于 MVC 结构的新手问题在这里。所以在 MVC 中,我目前在我的视图中有一个页面来显示来自数据库查询的结果列表,在这段代码中,我实例化了一个类,运行一个用于 sql 查询的方法,最后有一个 for each 循环和然后用 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

4 回答 4

1

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

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

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

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

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

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

于 2012-08-06T01:47:29.337 回答
0

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

从您在问题中概述的代码中,我会说这是一个典型的事务脚本,并且没有涉及特定类型的模型或视图层。

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

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

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

于 2012-08-06T00:22:56.580 回答
0

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

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

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

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

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


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

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

于 2012-08-06T01:32:10.573 回答
0

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

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

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

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

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

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

视图将是这样的:categories/show/">'; categories/show/">';

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

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

于 2012-08-06T00:44:00.100 回答