《php面向对象》第32课 封装复杂的MVC-最基本的控制器和视图类

在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目录中,并且 还要创建子目录 ,目录名称就是控制器的名称,子目录下面才是视图文件,文件名是控制器类中的方法名。

剩下的几行代码就容易理解了,检测视图文件是否存在,如果存在就把它包括进来。

看到这里,或许你感觉一头雾水。在面向对象编程中,越是底层的类越抽象,不容易理解,不过没关系,我们把这两个类和户自定义的控制器和视图结合来,或许你会明白一些。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 书 明

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值