一、首先我们应该了解什么是mvc,它是怎么样工作的,为什么用它
mvc是一中软件架构模式,它分了三层 1.控制层(controller)
2.模型层(model)3.视图层(view);
mvc是怎么样运行的呢
mvc框架的整个运行流程 (1)首先是进入口文件然后接着开始定义常量->引入函数库->自动加载类->返回结果->加载控制器->路由解析->启动框架
从运用方面的一个大致的过程
1浏览者 调用控制器,发出指令
2.控制器 按指令选取一个合适的模型
3.模型 按控制器指令取相应数据
4.控制器 按指令选取相应视图
5.视图 把步骤3取到的数据按用户需求显示
为什么使用mvc
MVC的主要作用是为了将代码分层、分类。
MVC的主要目的是为了解决Web开发中分离开发与设计工作,使其工作相对独立。
在这样的过程中还发现了其他的一些优点,网站的目录结构更加清晰,网站更易维护与扩展,可以实现模块的复用。
二、建立我们的框架目录
├─imocc # 网站根目录
│ ├─app # 应用目录
│ │ ├─ ctrl # 控制器目录
│ │ ├─views # 视图层目录
│ ├─core
│ │ ├─ common # 应用公共函数目录
│ │ ├─ config # 应用公共配置文件目录
│ │ ├─ lib # 类库
│ │ imooc.php #框架核心文件
│ │ │ ├─ config.php #配置读取
│ │ │ ├─ model.php # 数据库类
│ │ │ ├─ route.php # 路由类
│ .htaccess
│ index.php # 入口文件
我们从入口文件开始
入口文件主
1、定义常量
2、加载函数库
3、启动框架
首先去看看我我们入口文件的代码
define('WTY',realpath('./')); //当前框架所在的目录
define('CORE',WTY.'/core'); //框架的核心文件
define('APP',WTY.'/app');
define('DEBUG',true);
if(DEBUG)
{
ini_set('display_error','On');
}
else
{
ini_set('display_error','Off');
}
include CORE.'/common/function.php'; //加载函数库
include CORE.'/imooc.php'; //加载核心文件
然后在core下创建我们的框架核心文件imooc.php
<?php
namespace core;
class imooc
{
public static $classMap=array();
public $assign;
static public function run()
{
p("ok");
}
}
接着在我们的函数目录下创建function.php文件定义我们的p函数
<?php
function p($var)
{
if(is_bool($var))
{
var_dump($var);
} else if (is_null($var)){
var_dump(NULL);
} else {
echo "<pre style='position:relative;z-index:1000;padding:10px;border-radius:5px;background:#F5F5F5;border:1px solid #aaa;font-size:14px;line-height:18px;opacity:0.9;'>".print_r($var,true) . "</pre>";
}
}
在入口文件中加入
\core\imooc::run();
这样们的入口文件就完成了
接下来实现类的自动加载功能同样还是把这个方法放到imooc.php这个基础类中然后我们用这个自动加载实现对路由类的自动加载
在core文件夹下创建路由类route.php
<?php
namespace core
/*
*路由
*/
class route
{
public function __construct()
{
p('ok');
}
}
spl_autoload_register('\core\imooc::load'); //作用当类不存在是自动为我们引入这个类
在imocc.php文件中定义load方法首先定义一个存储类的数组
public static $classMap=array();
static public function load($class)
{
//自动加载类库
if(isset($classMap[$class]))
{
return true;
}
else
{
$class=str_replace('\\','/',$class);
$file= WTY.'/'.$class.'.php';
if(is_file($file))
{
include $file;
self::$classMap[$class]=$class;
}
else
{
return flase;
}
}
}
然后在run方法中添加
$route = new \core\lib\route();
这样我们的自动加载类就实现了接下来我们开始完善路由类
在这个路由类中我们要做的就是隐藏index.php、获取URL的参数部分、返回对应的控制器和方法名
怎么样隐藏index.php(我们用重写url的方式实现)
在我们的网站根目录下建立 .htaccess 的文件内容如下
public function __construct()
{
//p($_SERVER);
if(isset($_SERVER['REQUEST_URI']) && $_SERVER['REQUEST_URI']!='/')
{
$path=$_SERVER['REQUEST_URI'];
$patharr=explode('/',trim($path,'/'));
if(isset($patharr[0]))
{
$this->ctrl=$patharr[0];
unset($patharr[0]);
}
if(isset($patharr[1]))
{
$this->action =$patharr[1];
unset($patharr[1]);
}
else
{
$this->action ='index';
}
//p($patharr);
//url 多余的部分转换成 GET 参数
$count= count($patharr)+2;
$i=2;
while($i<$count)
{
if(isset($patharr[$i+1]))
{
$_GET[$patharr[$i]]=$patharr[$i+1];
}
$i+=2;
}
unset($_GET['url']);
//p($_GET);
}
else
{
$this->ctrl = 'index';
$this->action = 'index';
}
}
这段代码的意思就是当我们访问时带有控制器和方法时就去访问指定的控制器方法,如果不存在是就去访问默认的控制器和方法名这样我们的路由类就基本完成了