PHP程序如何在模型,视图和控制器页面之间传递值?例如,如果一个控制器有一个数组,它如何将它传递给视图?
编辑:
谢谢你的回答。我看到其中几个说明组件在同一页面中,但是当我看到类似CodeIgniter的东西时,我看到三个单独的PHP页面用于模型,视图和控制器。
答案 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方法将变量传递给模板。