在PHP中处理视图的正确方法

时间:2009-10-15 19:39:41

标签: php model-view-controller

在过去,我一直在创建我的应用程序,基本上是一个视图(即search.php或display.php)和一个带有一堆函数的大文件(即library.php)。我打算通过使用没有框架的MVC路由来改变这一切。我只是没有时间学习新的框架,我想完成这项工作,并尽我所能将PHP代码与我的HTML代码分开。如果我能做到这一点,我很高兴。无论如何,如何处理以下内容?自从我开始创建用户会员类型网站以来,我认为我一直在以错误的方式做这件事。

我们以stackoverflow为例。访客访问者在标题顶部看到“登录”页面。登录后,“标题”将更改为与站点成员相关的显示菜单。在这种情况下,我会看到我的用户名和注销链接(以及其他一些链接)。我过去所做的就是把我的header.php(我把它包含在我的主页面中)和一些if / else语句,我会根据用户是否登录来显示它。

我在某个地方找到了一个例子(不记得),它有两个独立的视图。如果是访客用户,则显示与登录用户不同的标题。如果我必须跟踪用户是否登录并且必须为用户显示正确的视图,我的代码会变得非常混乱。

4 个答案:

答案 0 :(得分:1)

我会看一下Smarty模板引擎。它位于http://www.smarty.net/

安装完成后,您应该能够编写将Controller与View分开的代码,如下所示:

SamplePage.php:

<?php
require 'Smarty.class.php';
class SamplePage extends Smarty
{
    public function handleRequest()
    {
        $this->template_dir = '.';
        $this->assign("text", "Hello World!");
        $this->assign("userLoggedIn", true);
        $this->display('SamplePage.htm');
    }
}
$page = new SamplePage();
$page->handleRequest();
?>

SamplePage.htm:

<h1>{$text}</h1>
{if $userLoggedIn}
  You are logged in.
{else}
  You are not logged in.
{/if}

您需要创建一个名为templates_c的Web服务器可写目录来运行此示例。

答案 1 :(得分:1)

在您尝试设计自己的MVC框架之前,我建议使用具有简单学习曲线的轻量级框架(例如kohanaphp)。这样你就已经熟悉了MVC的细节,以避免常见的陷阱 - 更重要的是 - 了解最佳实践。欢呼声。

答案 2 :(得分:1)

当人们可能会说“让你的php远离你的HTML”时,最重要的事情就是让你的业务逻辑远离你的观点。如果您使用它来处理基本视图逻辑(例如循环遍历列表)或是否根据当前用户会话显示链接或菜单中的日志,那么在html中使用实际的PHP代码/语法绝对没有错。那很好,花花公子。

<ul>
<?php
    foreach($items as $item):
?>
    <li><?= $item; ?></li>
<?php
    endforeach;
?>
</ul>

您仍然可以构建MVC应用程序并使用php作为视图逻辑。您的业​​务逻辑是处理域模型和数据持久性的任何事情。

据说这里有一篇关于这个主题的好文章:

http://fabien.potencier.org/article/34/templating-engines-in-php

在视图代码中使用像Smarty这样的模板引擎而不是纯php的优缺点。

如果您决定使用模板引擎,Smarty的替代品是最近发布的Twig引擎:

twig-project dot org

希望这有所帮助!

答案 3 :(得分:0)

MVC更像是一个“最佳实践”软件包..我看到人们在没有任何视图的控制器中编写代码应用程序..所以是的,一切都与一些相关。然而,你正在寻找的是一种划分你的层的方式..我不会走聪明的路线..你将不得不学习一种全新的语言..我会鼓励你花一点时间学习任何轻量级的MVC ..我真的很喜欢Code Igniter ..我已经使用了几次,让你开始很快。那里可能还有其他一些选择。

对于您的特定情况,您可以拥有一个主模板,可以说有2个包含...一个在$ _SESSION [userID]存在时运行,另一个在不运行时运行。几种方法......这只是一个想法。

正如我推荐的其他人一样,你花一天时间学习基本的MVC框架......从长远来看,这会有所帮助。