在MVC结构中,控制器类有核心的控制器类和用户自定义的控制器类,分别存放在fastphp目录和app目录中。用户自定义的控制器类必须继承核心的控制器类。
下面就来看一下核心控制器类
核心控制器类所在位置:
参考代码如下 :
<?php
namespace fastphp\base;
//控制器类
class Controller
{
protected $_controller;
protected $_action;
protected $_view;
// 构造函数,初始化属性,并实例化对应模型
public function __construct($controller, $action)
{
$this->_controller = $controller;
$this->_action = $action;
$this->_view = new View($controller, $action);
}
// 分配变量
public function assign($name, $value)
{
$this->_view->assign($name, $value);
}
// 渲染视图
public function render()
{
$this->_view->render();
}
}
我们会发现,核心的控制器类非常简单,主要完成三个任务:
在构造方法中,初始化了两个变量:控制器名,方法名。另外实例化了一个视图的对象
assign() 方法:主要实现向视图提供数据,两个参数:$name, $value ,分别 表示变量名称和变量的值。
render() 方法:主要实现调用视图的render() 方法,显示页面。
控制器类并不是独立的,我们必须配合着视图类一起分析才能掌握。
接下来我们看一下视图类的代码
<?php
namespace fastphp\base;
//视图
class View
{
protected $variables = array();
protected $_controller;
protected $_action;
function __construct($controller, $action)
{
$this->_controller = strtolower($controller);
$this->_action = strtolower($action);
}
// 分配变量
public function assign($name, $value)
{
$this->variables[$name] = $value;
}
// 渲染显示
public function render()
{
extract($this->variables);
$controllerLayout = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
//判断视图文件是否存在
if (is_file($controllerLayout)) {
include($controllerLayout);
} else {
echo "<h1>无法找到视图文件</h1>";
}
}
}
视图类的构造方法:根据传递过来的控制器名和方法名,对属性$_controller和$_action进行赋值。
视图类的assign() 方法,将控制器传递来的变量存放在属性:$variables 中,以数组的方式存放,其中传过来的变量名变成了数组的键,比如传过来的是: ‘name', '张三',最终会转换成 ['name'=>'张三']
视图类中的render() 方法中第一行代码:extract($this->variables); 是将数组中数据转换成多个变量,其中元素的键转换成变量名,元素的值转换成变量的值。
我们就extract() 函数详细介绍一下。
<?php
/* 假定 $var_array 是 wddx_deserialize 返回的数组*/
$size = "large" ;
$var_array = array( "color" => "blue" ,
"size" => "medium" ,
"shape" => "sphere" );
extract ( $var_array );
echo " $color , $size , $shape , $wddx_size \n" ;
以上例程会输出:
blue, large, sphere, medium
接下来,我们看这行代码:
$controllerLayout = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
还记得APP_PATH这个常量在哪儿定义的吗?
这行代码 主要根据 控制器名和方法名,构建用户所定义的视图文件所在路径。
所以说,用户所写 的视图文件,必须存放在app的views目录中,并且 还要创建子目录 ,目录名称就是控制器的名称,子目录下面才是视图文件,文件名是控制器类中的方法名。
剩下的几行代码就容易理解了,检测视图文件是否存在,如果存在就把它包括进来。
看到这里,或许你感觉一头雾水。在面向对象编程中,越是底层的类越抽象,不容易理解,不过没关系,我们把这两个类和户自定义的控制器和视图结合来,或许你会明白一些。