摘要:通过本章的学习,了解了MVC架构的原理,当客户端请求数据时,先通过controller控制器判断是哪种请求类型,再像model请求分发,model通过业务逻辑的处理,把数据返还给controller,controller再通过判断是需要显示到哪个页面,把数据发送给对应view,通过view把数据显示到用户的界面中。本章还学习搭建了MVC基础框架,项目结构如下:本次框架主要包含三大目录及其他文件:基
通过本章的学习,了解了MVC架构的原理,当客户端请求数据时,先通过controller控制器判断是哪种请求类型,再像model请求分发,model通过业务逻辑的处理,把数据返还给controller,controller再通过判断是需要显示到哪个页面,把数据发送给对应view,通过view把数据显示到用户的界面中。
本章还学习搭建了MVC基础框架,项目结构如下:
本次框架主要包含三大目录及其他文件:基类目录。该目录命名为pong。pong目录下面包含core目录、基类文件、配置文件、路由文件,其中,core目录包含了controller、view、model三个基类。
自己的应用项目。项目放在app目录下,app目录下设admin目录、home目录、Model目录,admin目录主要用于存放后台管理页面的数据,里面包含controller和view两个文件夹,分别存放具体页面对应的控制器文件和视图文件。home目录与admin目录的架构类型类似,主要用于存放前台的文件。Model目录,主要用于存放系统公用的model类,因为model类是可以给前台和后台公用,所以独立到一个文件夹中。
模板框架目录。该目录主要是通过composer下载的模板框架和数据库框架。
.htaccess文件。该文件主要用于页面的重定向。
composer.json和composer.lock文件。这两个文件主要是通过composer获取框架后自动生成的文件,其中composer.lock存放了框架的基础配置,如框架版本。
Index.php文件。该文件为入口文件,通过.htaccess文件配置的重定向,默认访问域名时,即进入该文件。
框架源码:
入口文件index.php<?php
/**
* 入口文件
*/
//导入模板框架
require __DIR__.'/vendor/autoload.php';
//导入基础类
require __DIR__.'/pong/Base.php';
//获取配置文件信息
$config=require __DIR__.'/pong/Config.php';
//定义根目录路径
define('ROOT_PATH',__DIR__.'/');
//获取查询字符串
$queryStr=$_SERVER["QUERY_STRING"];
//启动框架
(new \pong\Base($config,$queryStr))->run();
基础类Base.php:<?php
/**
* 基类
*/
namespace pong;
class Base
{
//配置数组
protected $config=[];
//查询字符串
protected $queryStr=[];
public function __construct($config,$queryStr='')
{
$this->config=$config;
$this->queryStr=$queryStr;
}
//设置调试状态
public function setDebug()
{
//如果调试模式为true,则开启调试模式,否则关闭调试模式
if ($this->config['app']['debug']) {
error_reporting(E_ALL);
ini_set('display_errors','On');
} else {
ini_set('display_errors','Off');
ini_set('log_errors', 'On');
}
}
//设置自动加载器
public function loader($class)
{
//把参数格式进行转换
$path = ROOT_PATH . str_replace('\\','/',$class) . '.php';
//判断文件是否存在
if(!file_exists($path))
{
header('Location:/');//返回根目录
}
//加载文件
require_once $path;
}
//启动框架
public function run()
{
//设置调试模式
$this->setDebug();
//自动加载
spl_autoload_register([$this,'loader']);
//请求分发
$route=new Route($this->config['route']);
echo $route->parse($this->queryStr)->dispatch();
}
}
配置基类config.php<?php
/**
* 配置文件
*/
return [
//应用配置
'app'=>[
//调试开关
'debug'=>true
],
//路由配置
'route'=>[
//默认模块
'module'=>'admin',
//默认控制器
'controller'=>'Index',
//默认操作
'action'=>'index'
],
'db'=>[
// 数据库类型
'database_type' => 'mysql',
// 默认数据库名称
'database_name' => 'frame',
// 默认主机名
'server' => 'localhost',
// 默认用户名
'username' => 'root',
// 用户密码
'password' => 'root',
// 编码
'charset' => 'utf8',
//端口
'port' => 3306,
]
];
路由基类Route.php:<?php
/**路由类*/
namespace pong;
class Route
{
protected $route=[];
protected $passInfo=[];
protected $params=[];
public function __construct($route)
{
$this->route=$route;
}
/**
* @param string $queryStr 链接参数
* @return $this 当前类的实例
*/
public function parse($queryStr='')
{
//去除字符串左右的/,并将参数全部转为小写
$queryStr=strtolower(trim($queryStr,'/'));
//通过/把字符串转成数组
$queryArr=explode('/',$queryStr);
//数组过滤掉空字符
$queryArr=array_filter($queryArr,function($value){
return trim($value)!='';
},ARRAY_FILTER_USE_BOTH);
//判断数组中有几个参数
switch (count($queryArr))
{
case 0:
$this->passInfo = $this->route;
break;
case 1:
$this->passInfo['module']=$queryArr[0];
break;
case 2:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
break;
case 3:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
$this->passInfo['action']=$queryArr[2];
break;
default:
$this->passInfo['module']=$queryArr[0];
$this->passInfo['controller']=$queryArr[1];
$this->passInfo['action']=$queryArr[2];
//从第四个元素开始遍历,即过滤掉路由的信息
for($i=3;$i
{
if(isset($queryArr[$i+1]))
{
$this->params[$queryArr[$i]]=$queryArr[$i+1];
}
}
break;
}
//返回当前对象
return $this;
}
public function dispatch()
{
//模块名
$module = $this->passInfo['module'];
//控制器名
$controller='\app\\' .$module . '\controller\\' . ucfirst($this->passInfo['controller']) ;
//操作
$action= $this->passInfo['action'];
//如果找不到,重新返回根目录
if(!method_exists($controller,$action))
{
header('location:/');
}
return call_user_func_array([new $controller,$action],$this->params);
}
}
控制器基类Controller.php<?php
/**控制器基类*/
namespace pong\core;
class Controller
{
protected $view=null;
public function __construct()
{
$this->view=new namespace\View();
$this->config();
}
//配置方法
public function config()
{
//设置后台模板目录的命名空间
$this->view->addFolder('admin', ROOT_PATH.'/app/admin/view');
//设置后台模板目录的命名空间
$this->view->addFolder('home', ROOT_PATH.'/app/home/view');
}
}
视图基类view.php<?php
/*视图基类**/
namespace pong\core;
use League\Plates\Engine;
class View extends Engine
{
public function __construct($directory = null, $fileExtension = 'php')
{
parent::__construct($directory, $fileExtension);
}
}
模型基类Controller.php<?php
/**模型基类*/
namespace pong\core;
use Medoo\Medoo;
class Model extends Medoo
{
public function __construct($option=null)
{
$config=require __DIR__.'../Config.php';
$option=$config['db'];
parent::__construct($option);
}
}
批改老师:韦小宝批改时间:2019-01-25 17:43:20
老师总结:写的很完整 不错不错 mvc是大部分PHP框架都在用的一种架构 简单 方面操作 易懂