如何在MVC的PHP页面之间传递值?

时间:2010-09-30 17:45:26

标签: php model-view-controller

PHP程序如何在模型,视图和控制器页面之间传递值?例如,如果一个控制器有一个数组,它如何将它传递给视图?

编辑:

谢谢你的回答。我看到其中几个说明组件在同一页面中,但是当我看到类似CodeIgniter的东西时,我看到三个单独的PHP页面用于模型,视图和控制器。

6 个答案:

答案 0 :(得分:6)

通常,您的控制器将创建一个视图对象,当它创建该视图对象时,它会传递信息。

<?php

class Controller {
    public function __construct() {
        $arr = array("a","b","c");

        $myView = new View($arr);
    }
}

class View {

    private $content;

    public function __construct($content) {
        $this->content = $content;
        include_once('myPage.inc.html');
    }
}


?>

答案 1 :(得分:2)

与大多数PHP MVC框架一样,CodeIgniter附带了一个View“引擎”。换句话说,框架中有一个类负责将数据从控制器加载到视图中。

特定于CodeIgniter,这些调用如下所示:

$data = array(
           'title' => 'My Title',
           'heading' => 'My Heading',
           'message' => 'My Message'
      );

$this->load->view('blogview', $data);

您的视图将是一个单独的php页面,在本例中为blogview.php。它可能看起来像这样:

<html>
   <head><title><?= $title ?></title></head>
   <body>
      <h2><?= $heading ?></h2>
      <p><?= $message ?></p>
   </body>
</html>

负责在控制器和视图之间传输数据的部分是CodeIgniter内部的View引擎(或类)。它从控制器获取该数组,并为视图反序列化。

那为什么要两个单独的文件? MVC范例是这样的,按照设计,您希望将业务逻辑与UI分离。如果您没有对数据库做太多工作,则无需合并MVC的Model部分。但是当你想要进一步将代码的数据访问部分与业务逻辑(为用户操作数据的东西)分开时,就会出现这种情况。在这种情况下,你有3个单独的文件;模型,控制器,视图。

所以不,组件并不都在同一页面,尽管它们当然可以。但是通过使用MVC构建程序,您可以干净利落地分离应用程序的操作。这样,您可以一次在一个图层中工作,而不会影响其他图层。例如,当你弄清楚用户无法登录的原因时,你的CSS人员可能会使网站看起来很漂亮。

答案 2 :(得分:1)

我希望Johnny很久以前找到了我现在正在寻找的答案,但我可以提供一个如何做到这一点令人不满意的见解!您可以从一个文件传递一个信息(比如收集网站用户输入的数据的“视图”组件)到另一个文件(比如一个'模型'组件,它检查/验证表单数据并将其发送回表单用于修订或将其存储在数据库中)。表单值可以通过POST或GET数组发送,'action'属性确定哪个文件接收数据,例如

<form action = 'form-exec.php' method = 'POST'>
---some set of  possible user inputs goes here
<input name='submit' type='submit' value='Go'>
</form>

处理完成后,您可能希望将某些数据返回到表单 - 例如需要修改的用户输入值或成功消息。您可以将该数据存储在会话变量中,并从“视图”页面上的这些变量中恢复它。那么,你如何回到“视图”页面?现在,我在这里,因为我已经看到这个使用过并且自己使用了它但是非常惊恐地看到,显然,转移是通过狗慢的互联网http请求 - 即使转移到同一个文件服务器上的目录!好的,所以回到你的'view'组件的UNSATISFACTORY方法就是这样的几行PHP:

header("location: theinputform.php");
    exit;

确实有效,但肯定有更好的方法吗?我看到有人说你应该只使用一个包含的“咆哮”,但我无法理解如何做到日常合理的事情,回到页面顶部并根据新的条件重新创建它。例如,如果我刚刚登录了一个用户,我不希望这次显示登录邀请。包含是有条件地添加到页面的东西是明智的,但我没有找到一个更好的方式简单地返回顶部而不是上面。有没有人对此有任何见解或知识?正如OP所述,Johnny和我想要像MVC一样做但不使用任何类型的MVC框架。有几本书和教程只是使用上面的“标题”方法,顺便说一句。

好的,编辑:您可以使用表单的“操作”属性从表单(即“查看”页面)到表单处理,如上所述。如果'model'页面没有输出html而只输出'做事',你可以简单地在完成后包含你想去(或返回)的'view'页面。无论如何,我是这么认为的!即将尝试......

答案 3 :(得分:1)

我自己也在努力解决这个问题。近十年后我回到了php编程。我遇到了几个将PHP MVC框架部署到实验服务器的问题,所以我最终自己构建了一个简单的MVC变体。

在我的简单设计(前端)中,控制器与模型交互以填充有效负载对象并将其传递给视图。每个视图都在一个单独的PHP文件中实现,因此控制器使用 include ,来加载&#34;加载&#34;理想的观点。 然后,视图可以通过指定名称($ dataId)访问有效负载对象的数据。

class Controller {
        public $model;
        ...
        public function display($viewId,$dataId,$data)
        {
          $url = $this->getViewURL($viewId);
          $this->loadView($url,$dataId,$data);              
        }

        public function getViewURL($key)
        {
            $url = 'view/list_view.php';

            if($key == 'create')
            {
                $url = 'view/create_view.php';
            }
            else if($key == 'delete')
            {
                $url = 'view/delete_view.php';
            }


            return $url;            
        }

        public function loadView($url,$variable_name, $data)
        {
            $$variable_name = $data;
            include $url;
        }
}

答案 4 :(得分:0)

模型,视图和控制器不是单独的页面而是一页 所以,不需要“传递”任何东西

答案 5 :(得分:-2)

您可以使用smarty之类的模板引擎将视图与控制器和模型分开。

并使用smarty的assign方法将变量传递给模板。