2

我正在构建一个小型 PHP MVC,并且我已经用一小部分编码撞到了墙。我认为我需要“部分视图”,但我可能能够使用现有代码实现某些目标。

我的控制器目前最简单的形式:

  • 实例化一个对象
  • 检查 POST 变量是否已设置
  • 根据需要显示视图 1 或显示视图 2

目前的观点:

  • 显示 HTML 标记
  • 使用并回显模型获取函数,例如 getUserInfo()

一切都很好,但是代码现在在控制器和视图中都变得相当大,并且我已经达到了需要在主视图(1和2)中包含“模块”或子视图的情况。

例如,如果加载了 view2,那么我需要显示(作为 view2 的一部分)另一个视图,比如一个 3 部分的注册表单。该注册表单也带有它自己的控制器文件。

我可以做这样的事情,它会起作用并让您对我正在尝试做的事情有所了解,但我承认这会破坏 MVC 设计模式。

看法

<div id="mydiv">Some content</div>
<div id="mysignup"> <?php include('controller_signup.php'); ?></div>
<div id="content"> The views main page content </div>

然后在正确的位置从控制器中拉入视图。

如前所述,我认为我需要使用部分视图,但是我发现的大部分信息都是针对 ASP 的,我有点迷失了!

我会认为这是一个相当普遍的问题,所以我认为有一个明显的解决方案!

谢谢!

4

2 回答 2

5

你问题的根源是你没有观点。您所谓的“视图”实际上是一个模板。这反过来又强制控制器中的表示逻辑。

在正确的 MVC 视图中是包含所有表示逻辑的实例。他们从模型层获取信息,然后根据数据选择如何显示这些信息。每个视图操作多个模板。

此外,您的控制器似乎获得了额外的责任。它应该改变模型层和当前视图的状态,而不是渲染模板。

于 2012-08-07T14:16:00.127 回答
2

不能说我同意tereško。将表示逻辑放在单独的视图类中似乎更合适,但它确实增加了另一层复杂性。在许多情况下,这个额外的层是不必要的——通常一个视图可以直接渲染你注入的任何模型或数据。因此,您最终会得到仅将模型从控制器传递到模板的空视图类。

我想说,保持简单,您可以使用简单的 MVC 制作非常复杂(且可维护)的网站,而无需引入模板的概念。

要处理子视图,您可以简单地让主视图将数据注入子视图,这对控制器应该是透明的(控制器只提供主数据而不关心它应该如何呈现)。所以在实践中,你可以有这样的东西:

控制器:

public function someAction() {
    // ...
    $view = new View('name');
    $view->data = $someList;
}

看法:

<?php foreach ($someList as $item): ?>
    <?php echo (new View('subview', $item))->render();
<?php endforeach; ?>
于 2012-08-07T14:54:51.420 回答