** 实际上框架的目的就是为了让前后端分离,代码更清晰,便于维护,各干各的事情.一目了然.**
- 新建框架根目录 dream
- 在根目录下建立单一入口文件 index.php
<?php
define('DREAM', __DIR__);//定义根目录常量
define('APP', DREAM .'/App/');//定义应用目录
define('CORE' , DREAM ,'/Core/');//定义核心文件目录
define('DEBUG' , true);//定义调试模式
//判断是否开启调试
if(DEBUG){
ini_set('display_errors' , 'On');
}else{
ini_set('display_errors' , 'Off');
}
//引入公共函数类库
require CORE . 'Common/function.php';
//引入框架核心文件
require CORE . 'dream.php';
//注册自动加载类
spl_autoload_register('\Core\dream::_autoload');
//启动框架
Core\dream::run();
- 在根目录新建 App文件夹 和 Core文件夹
- 在Core文件夹下新建 Common文件夹
- 在Common 文件夹下 新建 function.php
<?php
配置公共方法
function p($var) //打印函数
{
if (is_bool($var)) {
var_dump($var);
} elseif (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 文件 下 新建框架核心文件 dream.php
<?php
namespace Core;//定义命名空间
class dream
{
static public $classFile = [];
//框架启动方法
static public function run()
{
}
//自动加载类 当我们new 一个不存在的类 时 自动调用该方法
static public function _autoload($class)
{
//先处理 类名 的反斜线为正斜线
$class = str_replace('\\', '/', $class);
//然后再拼接文件路劲
$file = DREAM . '/' . $class . '.php';
//判断文件是否存在
if(isset($classFile[$class])){
return true;
} else {
require $file;
$classFile[$class] = $class;
}
}
- 在Core文件 下 新建路由文件 route.php
<?php
namespace Core;
class route
{
public $ctrl;
public $action;
public function __construct()
{
//判断路劲是否存在 且 路劲不能等于 '/'
if(isset($_SERVER['REQUEST_URL']) && $_SERVER['REQUEST_URL'] != '/'){
//接收并处理路径
$path = $_SERVER['REQUEST_URL'];
//去除两边的'/',并分割
$patharr = explode('/', trim($path, '/'));
//如果存在下标为 0 的就存储为控制器名
if(isset($patharr[0])){
$this->ctrl = $patharr[0];
}
//释放 为后面截取参数做准备
unset($patharr[0]);
//下标为 1 的如果存在就存储为方法名 并释放 否则就默认为index操作
if(isset($patharr[1])){
$this->action = $patharr[1];
unset($patharr[1]);
} else {
$this->action = 'index';
}
//统计$patharr 的数量
$count = count($patharr) + 2;
$i = 2;
while($i < $count){
//判断传的参数是否都存在 然后获取参数 否则不做动作
if(isset($patharr[$i] + 1)){
$_GET[$patharr[$i]] = $patharr[$i + 1];
}
$i = $i +2;
}
} else {
$this->action = 'index';
$this->ctrl = 'index';
}
}
}
然后再 dream.php 核心文件中加载 控制和方法
<?php
namespace Core;
class keep
{
static public $classMap = [];
public $assign;
static public function run()
{
$route =new \Core\route();
$ctrlClass = ucfirst($route->ctrl);
$action = $route->action;
$ctrlFile = APP.'Controller/'.$ctrlClass.'Controller.class.php';
$ctrlClass = '\\'.MODULE.'\\Controller\\'.$ctrlClass.'Controller';
if (is_file($ctrlFile)) {
require $ctrlFile;
$ctrl = new $ctrlClass;
$ctrl->$action();
} else {
throw new \Exception('找不到控制器',$ctrlClass);
}
}
static public function _autoload($class)
{
$class = str_replace('\\','/',$class);
$file = KEEP.'/'.$class.'.php';
if (isset(self::$classMap[$class])) {
return true;
}else{
if (is_file($file)) {
require $file;
self::$classMap[$class] = $class;
}else{
return false;
}
}
}
//将控制器里发送的数据 接收 并存储
public function assign($name,$value)
{
$this->assign[$name] = $value;
}
//加载模板文件
public function display($file)
{
//对接收到了文件名 拼接处理
$file = APP.'View/'.$file;
//如果存在 就引入
if (is_file($file)) {
//这里extract 是php 的一个函数 作用是将 数据打散 在模板使用
extract($this->assign);
require $file;
}
}
}
- 并在App 文件夹下 新建 Controller 文件夹.
- 在Controller 文件夹下 新建IndexController.class.php //这里为了防止命名冲突导致加载错误 所以名称这样建
- 在Core 文件夹下 新建 Lib 文件夹 在建立 model.php//连接数据库
<?php
namespace Core\Lib;
class model extends \PDO //继承PDO
{
public function __construct()
{
$dsn = 'mysql:host=localhost;dbname=test';//主机名 和库名
$username = 'root';//用户名
$passwd = 'root';//密码
try {
parent::__construct($dsn, $username, $passwd);
} catch (\PDOException $e) {
p($e->getMessage());//失败抛出异常
}
}
}
- 在Controller 下的IndexController.class.php 文件 进行数据 发送模板 加载模板
- $this->assign 方法 和$this->display 方法 在核心文件 dream.php 中定义
<?php
namespace App\Controller;
use Core\Lib\model;
class IndexController extends \Core\keep
{
public function index()
{
$model = new \Core\Lib\model();
$sql = "SELECT * from qiduo_market";
$res = $model->query($sql);
$data = $res->fetchAll();
// $data = 'Hello Wrold';
$this->assign('data',$data);
$this->display('index.html');
}
}
** 一套流程就是这样的,框架的作用是为了提高重用性,可维护性和便捷的操作.但是由于框架众多,功能齐全,但是自己又用不到那么多,占用资源.所以有必要试试做一个自己的框架. **