控制器
上文我们讲到通过路由实例化控制器、执行方法、传递参数,接下来我们就以默认的 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
感谢。
这么全面的教程,博主真厉害