代码之家  ›  专栏  ›  技术社区  ›  waiwai933

什么是PHP中的MVC示例?

  •  2
  • waiwai933  · 技术社区  · 15 年前

    我想了解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 回复  |  直到 6 年前
        1
  •  2
  •   Tyler Carter    15 年前

    控制器是您的逻辑,模型是您的数据,视图是您的输出。

    所以,这是控制器:

    $model = new UserDB();
    $user = $model->getUser("Chacha102");
    $view = new UserPage($user->getName(), $user->getEmail());
    
    echo $view->getHTML();
    

    模型是userdb类,它将提供我的数据。视图是我将数据从模型提供给的用户页面,然后它将输出该页面。

    正如您所看到的,在这个示例中,控制器并没有做太多的工作,因为您只是获取和显示用户数据。这就是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';
            }
        }
     }
    

    保持同样的输出

        2
  •  1
  •   Justin Ethier    15 年前

    控制器接收用户请求-通常有一种路由器接受一个URL并将请求路由到适当的控制器方法。

    控制器使用模型向数据库(或其他数据源)查询数据。

    从控制器调用视图以呈现实际的HTML输出。

        3
  •  1
  •   Robus    15 年前

    如果您只想创建一个简单的模板系统,那么您也可以使用:

    $content = 'blaba';
    $tpl = file_get_contents('tpl.html');
    echo str_replace('{content}',$content,$tpl);
    

    使用如下模板文件:

    <html>
    <head><title>Whatever</title></head>
    <body>{content}</body>
    </html>
    
        4
  •  1
  •   Mathew    15 年前

    在您的示例中,更像是将控制器拆分为模型和视图。

    • 模型: 业务逻辑/规则,通常是某种数据库到对象的关系映射
    • 控制器: 通过将适当的模型和视图组合在一起以生成输出来响应URL请求。
    • 观点: 输出将采用的视觉结构。通常是“哑”组件。

    当你第一次遇到的时候会很困惑 MVC Web应用程序的体系结构,主要是因为大多数Web框架根本不是MVC,而是与 PAC . 换言之,模型和视图不会说话,而是由控制器从给定请求中理解的上下文拉到一起的两个元素。查看Larry Garfield关于该主题的精彩评论,了解更多信息:

    http://www.garfieldtech.com/blog/mvc-vs-pac

    另外,如果您对MVC开发模式感兴趣,我建议您下载许多框架中的一个,并运行一两个教程。Kohana、Codeignor、Cakephp和Zend应该足以启动Google-A-Thon!

        5
  •  0
  •   Tim Lytle    15 年前

    Zend Framework: Surviving The Deep End 有一些很好的章节解释MVC。查看 MCV Intro 尤其是这个秘密 the model .

    对模型有许多解释,但对于许多程序员来说,模型等同于数据访问,这是一个错误的概念,大多数框架无意中通过不明显地承认它们没有提供完整的模型来提升。在我们的流行语淹没的社区中,许多框架在其文档中不清楚和模糊了模型的定义。

    回答“控制器在哪里”:

    控制器必须定义应用程序行为,仅在将用户界面的输入映射到模型中的调用并处理客户机交互的意义上,但除此之外,还应该清楚模型中包含所有其他应用程序逻辑。控制器是一种低级的生物,只有最少的代码,它们只是为应用程序运行的环境设置了一个阶段,并让事物以有组织的方式工作。

    我想你会把它(以及他对其他文章和书籍的引用)读得很好的。

        6
  •  0
  •   Rashid    6 年前

    下面是一个使用PHP的非常简单的MVC示例。有一件事不见了,那就是路由器。它选择一个控制器来执行该任务。我们只有一个控制器,客户。

    如果我们把它与三层比较

    型号:数据库 视图:客户端 服务器:控制器 路由器:选择控制器

    当您从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>