独立封装简单mvc框架(2)

来源:互联网 发布:女生自夸的网络句子 编辑:程序博客网 时间:2024/05/29 17:26

第一步首先编译入口文件:

<?php/** * Created by PhpStorm. * versions 1.0.0 * Date: 2017/8/1 * Time: 10:09 * By: Alemon ° *///定义项目路径defined('APP_PATH') or define("APP_PATH",__DIR__);//定义文件分隔符defined('DS') or define("DS",DIRECTORY_SEPARATOR);//是否开启错误模式defined('DEBUG') or define("DEBUG",true);//引入配置文件$config=include(APP_PATH.DS."config".DS."config.php");//引入核心框架include(APP_PATH.DS.'framework'.DS.'Appliaction.php');//运行核心框架(new framework\app\Appliaction($config))->run();?>


此时只有入口文件还是不行的,所以我们需要写一个核心框架,然后去运行它

|-framework   框架核心目录

        |-base 框架核心文件

           |-Controller.php   控制器基类

           |-Db.php              Db类

           |-Model.php        模块基类

           |-View.php          视图基类

        |-route

           |-route.php         路由规则

|-Appliaction.php  框架核心类


我们会通过这些基类去实现控制器、模块、视图各个部分


Application.php代码:

<?php/** * Created by PhpStorm. * versions 1.0.0 * Date: 2017/8/1 * Time: 10:32 * By: Alemon ° */namespace framework\app;use framework\route\route;header("content-type:text/html;charset=utf-8");class Appliaction {    public $config;    public function __construct($config){        $this->config=$config;     }    public function run(){        spl_autoload_register(array($this,'load'));        $this->checkdebug(); //模式        $this->setdefault(); //默认配置        $this->route();     //路由规则    }    /**     * 默认参数写入     */    public function setdefault(){        \framework\route\route::$defaultController=$this->config['defaultController'];        \framework\route\route::$defaultAction=$this->config['defaultAction'];        \framework\base\Model::$dbconfig=$this->config['db'];    }    //路由规则 并 实现方法    public function route(){        $route=new route();        $url1=$_SERVER['REQUEST_URI']; //重写规则        $url2=$_SERVER['SCRIPT_NAME']; //入口文件        $url=$_SERVER['QUERY_STRING']; //普通规则和兼容规则        if(empty($url)){            $url=str_replace($url2,"",$url1);            $params=$route->rewrite($url);        }else{            $params=$route->normal($url);        }        //拼接控制器的路径 然后去实现它        $controllername="\\App\\controllers\\".ucfirst($params['controller'])."Controller";        if(class_exists($controllername)){ //检测类是否存在            $actionname=$params['action'];            $obj=new $controllername($params['controller'],$actionname,$params['params']); //实力换类            if(method_exists($obj,$actionname)){  //检测类里的某个方法是否存在                $obj->$actionname();   //执行这个方法            }else{                die("方法不存在!");            }        }else{            die("控制器不存在!");        }    }    /**     * @param $className 类的自动加载     */    public function load($className){        $filename=APP_PATH.DS.$className.".php";        if(is_file($filename)){            include($filename);        }    }    /**     * checkdebug() 配置错误模式     * true 为开启 false为关闭     */    public function checkdebug(){        if(DEBUG){            ini_set('display_errors','On');//开启            error_reporting(E_ALL);//E_ALL 所有的错误        }else{            error_reporting(E_ALL);            ini_set('display_errors','Off'); //关闭            ini_set('log_errors','On');  //开启错误日志            ini_set("error_log",APP_PATH."/runtime/error_log.log"); //配置错误日志的路径        }    }}

route/route.php 路由规则:

<?php/** * Created by PhpStorm. * versions 1.0.0 * Date: 2017/8/1 * Time: 19:48 * By: Alemon ° */namespace framework\route;header("content-type:text/html;charset=utf-8");class route {    public static $defaultController='';    public static $defaultAction='';    //重写模式的路由规则    public function rewrite($url){        $url=trim($url,"/");        $uri=explode("/",$url);        $arr=[];        $params=[];        if(empty($uri[0])){            $arr['controller']=self::$defaultController;            $arr['action']=self::$defaultAction;        }else if(count($uri)<2){            $arr['controller']=$uri[0];            $arr['action']=self::$defaultAction;        }else{            $arr['controller']=$uri[0];            $arr['action']=$uri[1];            unset($uri[0]);            unset($uri[1]);            for($i=2;$i<=count($uri)+1;$i++){                if($i%2==0){                    @$params[$uri[$i]]=$uri[$i+1];                }            }            $arr['params']=$params;        }        return $arr;    }    //普通规则和 兼容规则    public  function normal($url){        $arr=[];        if(isset($_GET['c'])){            $url=str_replace(['c=','a=','&'],['','','/'],$url);            $arr=$this->rewrite($url);//        if(isset($_GET['c']) && !empty($_GET['c'])){//            if(isset($_GET['a']) && !empty($_GET['a'])){//                $arr['controller']=$_GET['c'];//                $arr['action']=$_GET['a'];//            }else{//                $arr['controller']=$_GET['c'];//                $arr['action']=self::$defaultAction;//            }        }elseif(isset($_GET['r'])){            $url=trim($url,"r=");            $arr=$this->rewrite($url);        }else{            echo "404 Not Found";        }        return $arr;    }}

最后看一下配置文件吧,在config/config.php:

<?php/** * Created by PhpStorm. * versions 1.0.0 * Date: 2017/8/1 * Time: 10:20 * By: Alemon ° */defined("BASE") or define("BASE",'http://www.alemon.com');  //域名return [    'defaultController'=>'index',//默认控制器    'defaultAction'=>'index',//默认方法    //数据库配置    'db'=>[        'host'=>'mysql',//连接数据库类型        'db_host'=>'127.0.0.1',//连接地址        'db_name'=>'test',//库名        'db_user'=>'root',//数据库用户名        'db_pwd'=>'root',//数据库密码        'db_charset'=>'utf8',//数据库编码格式    ],];

这些包含了类、模块的自动加载 以及最后的配置文件,下一节实现控制器的基类、参数问题等等


有什么不懂的或者不对的地方请指出来 多多指教 下面评论,有时间第一时间回复