我正在尝试理解MVC模式。这就是我认为的MV:
型号:
<?php
if($a == 2){
$variable = 'two';
}
else{
$variable = 'not two';
}
$this->output->addContent($variable);
$this->output->displayContent();
?>
查看:
<?php
class output{
private $content;
public function addContent($var){
$this->content = 'The variable is '.$var;
}
public function displayContent(){
include 'header.php';
echo $content;
include 'footer.php';
}
}
?>
这是对的吗?如果是这样,控制器是什么?
答案 0 :(得分:2)
控制器是您的逻辑,模型是您的数据,视图是您的输出。
所以,这是控制器:
$model = new UserDB();
$user = $model->getUser("Chacha102");
$view = new UserPage($user->getName(), $user->getEmail());
echo $view->getHTML();
该模型是UserDB类,它将为我提供数据。视图是我从模型中提供数据的UserPage,然后它将输出该页面。
正如您所看到的,控制器在此示例中没有做太多工作,因为您只是获取用户数据并显示它。这就是MVC的魅力所在。控制器不必处理用户SQL或HTML的东西,它只是抓取数据并将其传递给视图。
此外,视图对模型一无所知,模型对视图一无所知。因此,您可以实现其中任何一个,并且不会影响另一个。
与您的示例有关,您的视图是正确的,但您已将控制器和模型混合在一起。
你可以通过以下方式解决这个问题:
控制器:
$model = new NumberToWord();
$word = $model->getWord($a);
$this->output->addContent($word);
$this->output->displayContent();
型号:
class NumberToWord{
public function getWord($number)
{
if($number == 2){
return 'two';
}
else{
return 'not two';
}
}
}
并保持相同的输出
答案 1 :(得分:1)
控制器接收用户请求 - 通常有某种路由器接收URL并将请求路由到适当的控制器方法。
控制器使用模型向/从数据库(或其他数据源)查询数据。
从控制器调用视图以呈现实际的HTML输出。
答案 2 :(得分:1)
如果您只想创建一个简单的模板系统,那么您可以选择:
$content = 'blaba';
$tpl = file_get_contents('tpl.html');
echo str_replace('{content}',$content,$tpl);
使用如下的模板文件:
<html>
<head><title>Whatever</title></head>
<body>{content}</body>
</html>
答案 3 :(得分:1)
在您的示例中,更像是将Controller拆分为模型和视图。
当您第一次遇到Web应用程序的MVC架构时,可能会感到困惑,主要是因为大多数Web框架根本不是MVC,而是与PAC更加相似。换句话说,模型和视图不会说话,而是由控制器从给定请求中理解的上下文将两个元素拉到一起。查看Larry Garfield关于该主题的优秀评论,以获取更多信息:
http://www.garfieldtech.com/blog/mvc-vs-pac
另外,如果您对MVC模式的开发感兴趣,我建议您下载其中一个框架并运行一两个教程。 Kohana,CodeIgnitor,CakePHP和Zend应该足以启动Google-a-thon!
答案 4 :(得分:0)
Zend Framework: Surviving The Deep End有一些很好的部分解释MVC。在MCV Intro上查看the model,特别是此部分。
对模型有许多解释,但对于许多程序员来说,模型等同于数据访问,这是一种错误的概念,大多数框架无意中通过不明确地承认它们不提供完整的模型来促进。在我们的流行语淹没社区中,许多框架使模型的定义在文档中不清晰和模糊。
回答“控制器在哪里”:
控制器必须定义应用程序行为,只是它们将来自UI的输入映射到模型中的调用并处理客户端交互,但超出该角色应该清楚所有其他应用程序逻辑都包含在模型中。控制器是具有最少代码的低生物,只需设置阶段,让事情以有组织的方式运行,以适应应用程序运行的环境。
我认为你会好好阅读(以及他对其他文章和书籍的参考资料)。
答案 5 :(得分:0)
这是使用PHP的MVC的非常简单的示例。缺少的一件事是路由器。它选择一个控制器来完成这项工作。我们只有一个控制器,即客户。
如果我们将其与3层进行比较
型号:数据库 查看:客户 服务器:控制器 路由器:选择控制器
当您从Web浏览器上的应用程序中选择某些内容时,请求将发送至路由器,而请求将从路由器发送至控制器。控制器从模型询问并提出意见。视图已呈现给您。
只有模型可以与控制器来回对话。
1- Model.php
<?php
class Model
{
private $con=null;
private $r=null;
function connect()
{
$host="localhost";
$db="mis";
$user="root";
$pass="";
$this->con=mysqli_connect($host,$user,$pass) or die(mysqli_error());
if(!$this->con){
echo die(mysqli_error());
}
else mysqli_select_db($this->con,$db);
}
function select_all()
{
$this->connect();
$sql="select * from customers";
$this->r=mysqli_query($this->con,$sql) or die(mysqli_error());
return $this->r;
}
function display_all()
{
$i=0;
echo "aaaaaaaaaa";
$this->r=$this->select_all();
while($q=mysqli_fetch_array($this->r))
{
$i++;
echo $i."-Id:".$q['id']."</br>";
echo $i."-Name:".$q['name']."</br>";
echo $i."-Phone:".$q['phone']."</br></br>";
}
}
}
?>
2. Controller: There may may be many controllers.
<?php
class Customers extends Model
{
function select_all1()
{
//echo "aaaaaaa";
$this->display_all();
}
}
?>
3. View: There may be many views
<?php
include("model.php");
include("customers.php");
?>
<html>
<head><title>Customers</title></head>
<body>
<?php
$c=new Customers();
echo $c->select_all1();
?>
</body>
</html>