摘要:路由基类(Route.php) namespace pig; class Route { protected $route = []; //路由配置信息 protected $pathinfo = [
路由基类(Route.php)
namespace pig;
class Route
{
protected $route = []; //路由配置信息
protected $pathinfo = []; //pathinfo
protected $params = []; //url中的参数信息
public function __construct($route)
{
//初始化路由配置
$this->route = $route;
}
//解析路由
public function parse($queryStr = '')
{
//处理查询字符串
$queryStr = trim(strtolower($queryStr), '/');//将所有字符串猪场转成小写,并过滤两端的正斜线
$arr = explode('/', $queryStr);//将字符串以正斜线分割存到数组中
$arr = array_filter($arr, function ($val) {
if ($val !== '' && $val !== null && $val !== false) return 1;
return 0;
});//过滤数组中的空、null、false
$arr = array_merge($arr);//过滤数组中的空、null、false后保持键值的数字序列
//解析查询字符串中的内容
switch (count($arr)) {
case 0:
//使用默认模块、控制器、动作
$this->pathinfo = $this->route;
break;
case 1:
$this->pathinfo['module'] = $arr[0];
break;
case 2:
$this->pathinfo['module'] = $arr[0];
$this->pathinfo['controller'] = $arr[1];
break;
case 3:
$this->pathinfo['module'] = $arr[0];
$this->pathinfo['controller'] = $arr[1];
$this->pathinfo['action'] = $arr[2];
break;
default:
//对参数进行处理(非法路径使用.htaccess文件解决)
$this->pathinfo['module'] = $arr[0];
$this->pathinfo['controller'] = $arr[1];
$this->pathinfo['action'] = $arr[2];
//获取参数部分,$arr数组第四个索引开始到结束的作为参数处理
$params = array_slice($arr, 3);
for ($i = 0; $i < count($params); $i +=2) {
//参数成对出现,一个键一个值,
//如果参数有值,将该参数以键值对存在参数数组中;如果参数没有值,则放弃该参数
if(isset($params[$i + 1])) $this->params[$params[$i]] = $params[$i + 1];
}
break;
}
//返回当前对象
return $this;
}
public function dispatch(){
//模块
$module = $this->pathinfo['module'];
//控制器(控制器路径)
$controller = '\app\\' . $module . '\controller\\' . $this->pathinfo['controller'];
//动作
$action = $this->pathinfo['action'];
//检查控制器中是否存在动作
if(!method_exists($controller,$action)){
$action = $this->route['action'];
header('Location:/');
}
//将用户的请求分发到指定的控制器的指定方法上
return call_user_func_array([new $controller,$action],$this->params);
// echo $controller,'<br>',$action;
}
//获取模型、控制器、动作信息
public function getPathInfo(){
return $this->pathinfo;
}
//获取模块信息
public function getModule(){
return $this->pathinfo['module'] ? : $this->route['module'];
}
//获取控制器信息
public function getController(){
return '\app\\' . $this->getModule() . '\controller\\' . $this->pathinfo['controller'];
}
}
框架基础类(Base.php)
namespace pig;
class Base
{
//配置信息
protected $config = [];
//查询字符串
protected $queryStr = '';
public function __construct($config, $queryStr = '')
{
//初始化配置和查询字符串
$this->config = $config;
$this->queryStr = $queryStr;
}
//设置调试模式
public function setDebug()
{
if($this->config['app']['debug'] === true){
error_reporting(E_ALL);//在页面中显示所有错误信息
ini_set('display_errors','On');//开启错误输出
}else{
ini_set('display_errors','Off');//关闭页面显示错误
ini_set('log_errors','On');//开启错误日志
ini_set('error_log',BASE_PATH . 'log/error_' . date('YmdHis') . '.log');//设置错误日志存放位置
}
}
//注册自动加载器(自动加载类文件)
public function loader($class){
$path = BASE_PATH . str_replace('\\','/',$class) . '.php';
//检查类文件是否存在
if(!file_exists($path)){
header('Location: /');
}
require $path;
}
//启动框架
public function run(){
//调试模式
$this->setDebug();
//自动加载(spl_autoload_register():注册给定的函数作为 __autoload 的实现)
spl_autoload_register([$this,'loader']);
//请求分发
echo (new Route($this->config['route']))->parse($this->queryStr)->dispatch();
}
}
控制器基类(Controller.php)
namespace pig\core;
class Controller
{
//视图对象
protected $view = null;
//实例化视图类
public function __construct()
{
$this->view = new namespace\View();
}
//视图模板配置
public function config(){
//设置后台模板目录
$this->view->setDirectory(BASE_PATH . 'app/admin/view');
//设置后台目录别名(命名空间)
$this->view->addFolder('admin',BASE_PATH . 'app/admin/view');
//设置前台模板目录
$this->view->setDirectory(BASE_PATH . 'app/home/view');
//设置前台目录别名(命名空间)
$this->view->addFolder('admin',BASE_PATH . 'app/home/view');
}
//模板引擎核心功能:模板赋值、模板渲染
}
视图基类(View.php)
namespace pig\core;
use League\Plates\Engine;
class View extends Engine
{
//存储变量
protected $data = [];
/**
* View constructor.
* @param null $directory 当前模板的目录
* @param string $fileExtension 模板默认扩展名
*/
public function __construct($directory = null, $fileExtension = 'php')
{
parent::__construct($directory, $fileExtension);
}
}
模型基类(Model.php)
namespace pig\core;
use Medoo\Medoo;
class Model extends Medoo
{
public function __construct($options = null)
{
//加载配置文件
$config = require "/pig/config.php";
$options = $config['db'];
//实例化数据库框架Medoo
parent::__construct($options);
}
}
批改老师:韦小宝批改时间:2019-01-16 17:47:23
老师总结:写的非常不错 课后一定要多研究 才能真正的掌握 不过写到这个程度已经非常的不错了