PHP MVC,部分视图?

Posted

技术标签:

【中文标题】PHP MVC,部分视图?【英文标题】:PHP MVC, partial views? 【发布时间】:2012-08-07 10:59:56 【问题描述】:

我正在构建一个小型 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 的,我有点迷失了!

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

谢谢!

【问题讨论】:

我已经解决并且我认为在我开发的框架中克服了这个问题github.com/tbd-develop/bounce 如果它可以帮助你看一下。它的功能并不完全,但如果你看一下 core/library/renderer.php 部分视图的东西就在那里。我认为还没有任何可行的示例,我正在设置。 感谢您的回复。刚刚也看了一下你的代码,看起来令人印象深刻!那么,以最简单的形式,您有一个调用 include() 的方法?谢谢! 有两种方法,一种是包含请求的文件的包含方法,另一种是调用控制器执行数据库逻辑等然后包含在常规页面输出中的方法。 RenderPartial 和 Partial 是两种方法。 好的,谢谢,我不知道他们在做什么,所以我要玩一玩!刚刚找到这个somethingstatic.com/… - 决定! 感谢分享。如果我能帮忙,请告诉我,我很乐意。 【参考方案1】:

你问题的根源在于你没有观点。您所谓的“视图”实际上是template。这反过来会强制控制器中的表示逻辑。

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

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

【讨论】:

感谢您的回复。您可能是正确的,因为我没有正确掌握观点! - 您是否知道一个有用且简单的参考资料,我可以查看它以获取有关正确“视图”设计的更多信息?是的,我的控制器目前正在选择要显示的“模板”,这应该在哪里完成?谢谢! 值的分配和模板的渲染应该发生在视图中。也许this article 会有所帮助。这就是我自己开始研究 MVC 的地方。 我刚看了这篇文章r.je/view-helpers.html的页面,这也是我第一次开始看“视图助手”的概念!看起来很有信息量,所以我稍后会完整阅读,请留意您的通知,我相信会有一些!非常感谢! 您可能还会发现this old answer 非常有用。 非常感谢。我已经对视图、模板、助手等进行了大量阅读。但我无法找到正确视图的可靠示例,按照我的看法,这应该包括整个页面的 HTML 标记,然后是否包含较小的模板文件来填充内容模块?我猜想阅读视图应该如何避开逻辑让我觉得我不能做像 整体视图文件里面?也许您可以将我链接到调用模板的“正确”视图文件?谢谢!【参考方案2】:

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

我想说,保持简单,您可以使用简单的 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; ?>

【讨论】:

谢谢 - 你能提供一个例子来说明我的“视图”类的内容吗?目前我没有一门处理你看到的视图的课程!谢谢! 问题是他已经引入了模板的概念。 OP 只是称它们为“视图”(这与您犯的错误相同)。

以上是关于PHP MVC,部分视图?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 3 防止部分视图缓存

MVC 6 视图组件与部分视图:有啥区别?啥时候应该使用每个? [关闭]

编写自己的PHP MVC框架笔记

MVC4如何在父视图单击提交时获取部分视图中的数据

MVC部分视图的巧用

ASP.NET MVC4 部分视图