前面的实例中,我们通过router.php对于不同请求分配给不同的control类来处理,而control又根据不同的请求内容,调用不同的model类来提取数据,基本流程如下图所示。现在我们需要来做的是通过view将数据展现出来。
view视图就是最终数据展现的模板,一般而言,视图层通常希望由前端人员来做,而前端人员常常对后端技术不了解或者我们不希望他们更多了解后端是怎么处理数据的,他们只需要通过简单的语法调用数据就可以。这样做的目的,达到数据页面的分离。我们在views文件夹下新建一个view_photo.php文件,代码如下:
<html> <head></head> <body> <img src="<?=$data['photosrc'];?>" title="<?=$data['photodescri'];?>"> </body> </html>
这是我们很熟悉的HTML,你可能会问这和以前php与html代码混合编程有何不一样?,这虽然有些类似但是有一点不同是,我们的业务逻辑已经和视图分离了。在后面的优化中,我们会将显示数据的语句做得更简洁,完全让前端人员不需要输入php语法[discuz!,dedecms等就是用简单标签来在view层显示数据的]。
五.创建Model模块文件
我们已经能通过类似index.php?channel=photo&content=latest来识别访问的不同频道,但是我们希望controllers只是负责action的分发,具体读取和显示数据分别由models和views来实现,这样能有更好的扩展性。
我们在models下面新建一个photo.php文件用于读取图片信息,这个信息通常存储在数据库或者是文件中,为了简单化理清思路,我们先不管从何处得到数据,而是直接显示一张图片。
<?php class photo_Model { public function __construct() // 构造函数,创建对象时自动执行 { echo("<img src='http://www.mosang.net/mvc/link.jpg'/>"); // 显示一张图片 } } ?>
下面更改controllers文件夹下的photo.php,我们不再希望photo.php直接输出信息,而是交给models下面的photo.php来实现。代码如下:
<?php class photo_Controller { var $channelname ; function showcurrent($channelname) { $this->$channelname = $channelname; $photosModel = new photo_Model($channelname); } } /* 删掉了 echo("您正在访问的频道是:".$channelname)这条语句。新增了创建图片模型类的语句 */ ?>
此时,我们输入地址会报错,因为还没有引入models下面新建一个photo.php文件。更改controllers目录下router.php,代码如下:
<?php $channel = $_GET["channel"]; //获取频道名 $action = $_GET["action"]; $channelFile = SERVER_ROOT . '/controllers/' . $channel . ".php"; //频道名对应的php文件 $ModelFile = SERVER_ROOT . '/models/' . $channel . ".php"; //频道名对应的php文件 if (file_exists($ModelFile)) { include_once ($ModelFile); //频道名对应的php文件引 } else { die("不存在该频道的Model文件!"); } if (file_exists($channelFile)) { include_once ($channelFile); //频道名对应的php文件引入 $channelclass = $channel . "_Controller"; if (class_exists($channelclass)) { $controller = new $channelclass; //创建实例 $controller->showcurrent($channel); //输出入当前频道名 } else { die("不存在该频道的类!"); } } else { die("不存在您请求的频道!"); } ?>
现在在地址栏中输入域名+ index.php?channel=photo&content=latest,可以得到以下运行结果:
现在复制models下的photo.php文件,并放在同一目录下并更改文件名为news.php,更改news.php代码如下:
<?php class news_Model { var $channelname; function __construct($channelname) { $this ->$channelname = $channelname; echo($channelname."频道为您展示的内容:慕尼黑市计划再次投票是否从Linux迁回到Windows"); } } ?>
同时修改controllers文件夹下的news.php,代码如下:
<?php class news_Controller { var $channelname; function showcurrent($channelname) { $this -> $channelname = $channelname; $newsModel = new news_Model($channelname); } } ?>
运行域名+ index.php?channel=news&content=latest,可以得到以下运行结果:
news频道为您展示的内容:慕尼黑市计划再次投票是否从Linux迁回到Windows
到目前为止,我们大致了解了controllers,models请求处理的分工。