框架流程

2017-04-13  本文已影响0人  孤岛渔夫

** 实际上框架的目的就是为了让前后端分离,代码更清晰,便于维护,各干各的事情.一目了然.**

<?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();
<?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>";
    }
}
<?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;
      }
}
<?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;
        }
    }
}
<?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());//失败抛出异常
        }
    }
}
<?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');

    }
}

** 一套流程就是这样的,框架的作用是为了提高重用性,可维护性和便捷的操作.但是由于框架众多,功能齐全,但是自己又用不到那么多,占用资源.所以有必要试试做一个自己的框架. **

上一篇下一篇

猜你喜欢

热点阅读