MVC:嵌套视图和控制器(用于网站)

时间:2010-05-16 20:34:59

标签: php model-view-controller web view controller

我即将使用MVC模式做一个PHP网站。我没有使用框架,因为网站相当简单,我觉得这将给我一个直接了解模式的好机会。我有几个问题。

问题1:我应该如何组织我的观点?我正在考虑使用具有页眉和页脚的页面视图,这将允许内容视图嵌套在它们之间。

问题2:如果我有5个内容页面,我应该制作5个不同的视图,可以用作嵌套在页面视图中的内容吗?或者,我是否应该将它们全部扩展为名为AbstractContent的抽象视图?

问题3:控制器怎么样?我认为至少应该有一个主控制器。但那时请求从哪里开始呢?到另一个控制器?或者我应该只是调用页面视图并保留它?我认为控制器应该处理输入,可能修改模型,并选择一个视图。但是,如果嵌入控制器调用的视图中的其中一个视图需要解析其他输入呢?

问题4:是否允许控制器将参数传递给视图?或者控制器是否应该简单地修改模型,然后影响视图?或者只是数据库访问和其他类似的模型?

3 个答案:

答案 0 :(得分:2)

  1. 考虑一下您希望HTTP响应的样式:带有/不带导航的完整页面,用于打印的剥离页面,JSON& XML响应,索引/站点地图。在您感觉网站正在形成之后,添加越来越多的快捷方式,以尽可能少的代码获取您的响应。
  2. 如果页面布局相似,我会使用相同的视图并从模型(可能是数据库)中加载内容。
  3. 查看Front Controller pattern:您应始终能够在单个入口点与请求相交。我会在你的控制器前放置一些东西,然后每个“主页”(论坛,博客,新闻)都有一个控制器。这足以控制,但你必须决定哪些块足够大/小。
  4. 控制器负责传递到视图中的所有内容。控制器应该获取数据和设置&什么 - 不是从模型中传递给视图。

答案 1 :(得分:2)

问题1:

这确实是一种方法,我总是使用它。

问题2:

让视图尽可能简单。我倾向于只创建5个单独的视图(普通的php文件)。

问题3:

在普通的mvc模式中,有一个前端控制器(操作系统只是一个引导程序文件,index.php),它执行一个控制器。

在HMVC中,控制器可以向其他控制器发送附加请求。

问题4:

正常的MVC模式适用于普通应用程序,其中视图是持久的,并且可以观察模型。对于Web应用程序,这是不可能的,因为每个请求都会重新加载。因此,最常用的模式是让控制器将参数传递给视图。

答案 2 :(得分:2)

1 - 这是一个偏好问题。最简单的方法是使用单独的页眉和页脚文件。然后你可以在你的页面控制器中做这样的事情

$title="Page Title";
$var1 = 'var1';
$var2 = 'var2';
$var3 = array("asdf","adsfasdf","234");    

include(HEADER); //$title is in header
include(DIR_VIEWS . 'page.php'); //$var1/2/3 are in page.php
include(FOOTER);

// variable were created before pages were included so they will be set in the templates

如果您要使用嵌套路线,则必须开始摆弄str_replace并开始朝向模板引擎,超出此答案的范围。

2 - 无需制作视图对象。 “视图”可以只是文件系统中包含该视图的html的文件。像我上面的例子。这些页面也可以包含基本的php to loop / echo变量。

3 - 您正在描述前端控制器(有时称为调度程序或路由器)。这真的是要走的路。有几种方法可用于创建前端控制器。

您可以拥有一系列指向控制器的网址。

$routes = array (

    '~^/home/$~' => 'home.php',
    '~^/contact/$~' => 'contact.php',
    '~^/blog/.*?$~' => 'blog.php'

);

或者您可以使用url中的第一个“目录”作为控制器名称,并从控制器目录中加载该文件。

4 - 控制器的整个点是从模型中获取信息并将数据传递给视图。

<小时/> 编辑评论


如果您希望一组视图有侧边栏,则只需在另一个视图中包含该视图即可。例如:

<div id="content">
    <p>lorem ispum stuff</p>
</div>
<?php include(DIR_VIEWS . 'sidebar.php');

只需确保在控制带有侧边栏的页面的控制器中包含一些侧边栏功能代码:

if ( $_GET['keywords'] ) {
    $sidebar_search_results = get_search_results($_GET['keywords']);
}
// this code should be in a file that you include

$sidebar_search_results可以是侧边栏视图分析和显示的结果数组。