Ryongyon!

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

· 杂乱无章 · · 3144次浏览

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 源码讲解

评论 (90条)
  1. ivermectin 6

    回复
  2. We’re a digital marketing and SEO agency based in Dubai offering practical and effective marketing solutions to businesses across the UAE.

    viagra

    回复
  3. plaquenil 100mg tablets

    回复
  4. levitra 40 mg pills

    回复
  5. cialis cost in mexico

    回复
  6. buy viagra online australia paypal

    回复
  7. online buy cytotec cheap viagra fast shipping cost of cialis with insurance viagra 50 mg tablet online sildenafil pharmacy prices ivermectin 10 ml

    回复
  8. Gaiscic

    https://buyplaquenilcv.com/ - Plaquenil

    回复
  9. buy viagra online canada with mastercard i want to buy viagra

    回复
  10. tadalafil cost 20 mg

    回复