什么是PHP中的MVC示例?

时间:2010-05-09 00:49:36

标签: php model-view-controller

我正在尝试理解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';
    }

}
?>

这是对的吗?如果是这样,控制器是什么?

6 个答案:

答案 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>