Ryongyon!

这世界上假绅士太多,缺少训练有素的流氓

· 杂乱无章 · · 8613次浏览

TinyPHP 源码讲解(3):控制器、模型、视图

控制器

上文我们讲到通过路由实例化控制器、执行方法、传递参数,接下来我们就以默认的 index 控制器为例子进行讲解。

<?php
/*********************
      index 控制器
**********************/
namespace Core\Controllers;
use Core\Controller;
use Core\Models\indexModel;

class indexController extends Controller {

    // 初始化
    public function init() {
        // 操作模型
        $options = (new indexModel())->getOptions();
        // 分配变量
        $this->assign('options', $options);
        // 渲染视图
        $this->render('index.php');
    }

}

首先我们可以看到 index 控制器 继承于 Controller 基类(注意:所有控制器文件都应当继承Controller 基类),所以我们在 index 控制器里可以调用 Controller 基类里的方法。

往下,我们前面提到了路由调用了 index 控制器后执行了 init 方法(注意:所有控制器文件都应当有一个 init 方法,因为当不指定方法名时默认就是执行此方法),那么我们接着可以看到在此方法中,我们对 index 模型进行了操作,得到了一些数据。

我们通过 $this->assign() 将得到的数据传递给 Controller 基类 (由 Controller 基类再传递给 View 基类)

最后我们通过 $this->render() 指定一个视图文件名传递给 Controller 基类 (同上,由 Controller 基类再传递给 View 基类)

模型

上面我们看到了 index 控制器实例化了一个 index 模型,并且执行了模型里的 getOptions 方法 接下来我们看看 index 模型做了什么事情。

<?php
/*********************
      index 模型
**********************/
namespace Core\Models;
use Core\Model;

class indexModel extends Model {

    // 获取 options
    private $options;
    public function getOptions() {
        // 操作数据库
        $this->execute("SELECT * FROM " . DB_PREFIX . "options");
        // 返回结果
        return $this->fetchAll('name');
    }

}

同样的,我们可以看到 index 模型也继承于 Model 基类,一般来说我们可以在 Model 基类中提供一些通用的操作数据库方法,这些就需要你去扩展了,源码中 Model 基类 并没有提供任何方法。但是为了后期维护、代码规范,我们所有我模型文件也都应当继承于 Model 基类。

往下我们可以看到 getOptions 方法就是查询数据库 options表的内容,并且返回给控制器。这里很好理解不在阐述。有关数据库操作的方法可以看这里:https://github.com/Ryongyon/TinyPHP#this-execute

视图

下面我们看一下 View 基类的源码

<?php
/*********************
        View基类
**********************/
namespace Core;
use Exception;

class View {

    // 分配变量
    private $variables = [];
    public function assign($name, $value) {
        $this->variables[$name] = $value;
    }

    // 渲染视图
    public function render($page) {
        $page = PAGES_PATH . $page;
        if (file_exists($page)) {
            include_once $page;
        } else {
            throw new Exception('无法匹配 ' . $page . ' 视图文件', 404);
        }
    }

}

可以看到两个方法都是用于接收 Controller 基类 传递过来的指令的。

assign 方法用于接收数据,并且将数据保存在 $variables ,以便使用。

render 方法是判断指定的视图文件是否存在,如果存在则加载,如果不存在则抛出一个异常错误。调试模式关闭的情况下会跳转404

最后我们前往 pages/index.php 文件可以看到我们通过 <?php echo $this->variables['options']['title']['value']; ?> 获取刚刚从数据库查询出来的数据。

一般来说不建议这么做,否则后期难以维护,我们应该在 View 基类对数据进行处理封装,比如封装一个 getTitle 方法,最后在视图文件中通过 $this->getTitle() 去获取。这里只是为了方便演示理解而已。

最后

看到这里,我们已经能够理解以下这三个东西其实就是一个 调度中心

  • Controller 基类
  • Model 基类
  • View 基类

自此我们已经能够理解一个 MVC 框架是如何工作了的,你可以通过二次开发、扩展、完善 TinyPHP 打造成一个属于你自己的 PHP 框架。对了,由于 TinyPHP 会不定时更新,该系列文章不会随着源码变动而更新,需要了解最新文档请关注:https://github.com/Ryongyon/TinyPHP

感谢。

TinyPHP 源码讲解

评论 (2条) 取消回复
  1. 这么全面的教程,博主真厉害

    回复