摘要:通过本章的学习,了解了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<count($queryArr);$i+=2) { 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框架都在用的一种架构 简单 方面操作 易懂