轻量级mvc php,自己编写基于MVC的轻量级PHP框架
本人之前asp.NET一年开发,jsp半年,可是后来因为工作的原故换成PHP.其实很不喜欢PHP的语法.还有PHP的函数名,每
做WEB开发已有三年,每次都写重复的东西,因此,想自己写一下框架,以后开发方便. 本人之前asp.NET一年开发,jsp半年,可是后来因为工作的原故换成PHP.其实很不喜欢PHP的语法.还有PHP的函数名,每回都忘记..还是喜欢C#和JAVA的语法,哈...不过PHP有PHP的优点,不像ASP.NET那样封装了大量的东西,PHP更简单,更自由吧.还有应该就是PHP的开源组合. 写这编文章主要是因为那些东西要写给别人看,顺便发表了.高手看了别笑,菜鸟自己注意辨别,别被我的错误观点误导. 文章中的代码下载 一.文件结构 ├index.php入口文件 ├class类存放的文件夹 ├base.class.php基类 ├error.class.php错误处理类 ├parms.class.php获取参数类 ├control.class.php控制类 ├model.class.php模型类 ├templatesmartTemplate类存放文件夹 ├dbadodb类存放文件夹 ├includes包含文件类 ├defines.inc.php定义各路径文件 ├frameword.inc.php框架处理文件 ├router.inc.php路由文件,跟据参数,跳转不同路径 ├models模式存放路径 ├views模版文件保存路径 ├controls存放控制类的文件夹 ├config.php配置文件 ├admin后台 ├ ├ 二.简单类图 三.入口文件,index.php define("EXEC",1);//初始化一个常量,保存别的文件必须先有这个入口文件的引用. define('PATH_BASE',dirname(__FILE__));//获取入口文件的路径 define('DS',DIRECTORY_SEPARATOR);//目录的分隔,’/’或’’ define('PATH_ROOT',PATH_BASE);//站点的跟目录,跟据你的入品文件存放来定义,如果放在子目录下,则要做相应修改.如下, //把路径分组 {parts=explode(DS,PATH_BASE); //去除最后一个路径名 array_pop(parts); define('PATH_ROOT',implode(DS,parts));} require_once(PATH_ROOT.DS.'includes'.DS.'defines.inc.php');//各文件夹的路径 require_once(PATH_ROOT.DS.'includes'.DS.'framework.inc.php'); echorequest->Get('a');//参数的获取GET方法 request->Post(‘a’);//获取POST参数 四.路径定义文件defines.inc.php /* */ //nodirectaccess defined('EXEC')ordie('Restrictedaccess');//如果单独执行这个文件,将不能执行 //站点路径 define('PATH_SITE',PATH_ROOT); //包含文件路径 define('PATH_INCLUDE'php轻框架,PATH_ROOT.DS.'includes'); //类文件路径 define('PATH_CLASS',PATH_ROOT.DS.'class'); //配置文件路径 define('PATH_CONFIG',PATH_ROOT); 五.框架文件路径frameword.inc.php f //nodirectaccess defined('EXEC')ordie('Restrictedaccess'); //loaderrorclass require_once(PATH_CLASS.DS.'error.class.php');//包含错误处理文件 //loadbaseclass require_once(PATH_CLASS.DS.'base.class.php');//包含基类文件 //实例化基类 load=newBase(); //实列化请求类用于获取GET或POST //加截一个自己写的类的方法 //把自己写的类放在class文件夹下面,文件名的格式为demo.class.php //那么类名就为classdemo{} //实便化的方式为demo=load->library(‘demo’); //调用demo类的Get函数则为demo->Get(‘参数’); request=load->library('params'); //不同的目录用不同的URL方式 require_once(PATH_BASE.DS.'includes'.DS.'router.inc.php'); 六.基类函数包含了常用的功能base.class.php //nodirectaccess defined('EXEC')ordie('Restrictedaccess'); classBaseextendsError { varpath_root=''; varpath_class=''; varpath_control=''; /*/构造函数 *@paramepath应用路径 *returnnull */ publicfunctionBase() { this->path_root=PATH_ROOT; this->path_class=PATH_CLASS; this->path_control=PATH_BASE.DS.'controls'; } //加载模型 //loadmodel functionmodel(name) { include_once(this->path_model.DS.name.'.php'); model=null; if(model==null) { model=newname(); } returnmodel; } //outputpage /* *@paramaternamefilename *@paramaterdatareplace * */ functionview(name,data) { Template=self::template(file); Template->output(data); unset(Template); } //createdatabaseconnection functiondatabase() { include_once(PATH_CLASS.DS.'db'.DS.'adodb.inc.php'); this->db=ADONewConnection(); this->db->createdatabase=true; result=this->db->Connect(self::config('db_host'),self::config('db_user'),self::config('db_password'),self::config('db_database')); if(!result) { die("Couldnotconnecttothedatabase."); }else{ this->db->Execute("setnames'utf8'"); returnthis->db; } } //createtemplate functiontemplate(file) { include_once(PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php'); Template=newSmarttemplate(file); Template->template_dir=PATH_BASE.self::config('template_dir'); Template->cache_dir=PATH_BASE.self::config('cache_dir'); returnTemplate; } //importclass functionlibrary(className) { if(empty(className)) { returnnull; exit(); } else { require_once(PATH_CLASS.DS.className.'.class.php'); returnnewclassName(); } } //returnconfigvalue functionconfig(parameter) { require_once(PATH_CONFIG.DS.'config.php'); returnCONFIG::Ini()->parameter; } } 七.控制器父类control.class.php classControlextendsBase { varrequest; functionControl() { this->request=this->library('params'); } //outputpage /* *@paramaternamefilename *@paramaterdatareplace * */ functionview(name,data='') { Template=this->template(name.'.html'); Template->assign('site_root',this->config('site_root')); Template->assign(data); Template->output(); unset(Template); } //loadmodel functionmodel(name) { include_once(PATH_BASE.DS.'models'.DS.name.'.php'); if(this->model==null) { this->model=newname(); } returnthis->model; } } 八.模型父类model.class.php classModelextendsBase { varrequest; vardb; functionModel() { this->request=this->library('params'); } //createdatabaseconnection functiondatabase() { if(this->db!=null) { returnthis->db; exit; } include_once(PATH_CLASS.DS.'db'.DS.'adodb.inc.php'); this->db=ADONewConnection(); this->db->createdatabase=true; result=this->db->Connect(this->config('db_host'),this->config('db_user'),this->config('db_password'),this->config('db_database')); if(!result) { die("Couldnotconnecttothedatabase."); }else{ this->db->Execute("setnames'utf8'"); returnthis->db; } } } 九.路由文件,router.inc.php 跟据URL,指定到相应的控制器,跟据网站的URL表现形式编写 //nodirectaccess defined('EXEC')ordie('Restrictedaccess'); //实例化类 load=newBase(); //实列化请求类用于获取GET或POST request=load->library('params'); //获取参数 option=@request->get('option'); task=@request->get('task'); //如果未设置文件 if(empty(option)) { option=load->config('index_router'); } include_once(PATH_BASE.DS.'controls'.DS.option.'.php'); Control=newoption(); if(empty(task)) { Control->index(); } else { Control->task(); } 十,使用方法 使用方法. 视图V:在把模板文件放在VIEW文件夹里面.命名方式为,login.html 控制C:把要怎么处理的文件放在control文件夹里面, 格式为.demo.php classdemoextendsControl { functionedit() { data=this->user->issuer();//调用模型 this->view(‘login’,data);//这个LOGIN为视图中的login.html文件 } } 模型M:把文件放在model文件夹里面.格式为.user.php classuserextendsModel { functionissuer() { 数据库或底层的操作,返回结果 } } 自定义类的调用,把类放在Class文件夹下面.格式为session.class.php 先实例化. session=load->library(‘session’); 然后再调用类中的函数 session->sessionId(); 例子: 如下URL:(注:这里的URL格式可以在router.inc.php里面修改.同时为了让不同目录的地址格式不一样,比如前台和后台,因些,把router.inc.php规则放在了入口文件的includes目录下面)则会调用/admin/control/文件夹下面的test.php文件test类的getUser函数,如果task参数为空,则调用index函数. 文件:/admin/control/test.php classtestextendsControl { functionindex() { } functiongetUser() { data['user']=this->model('member')->getUser(); this->view('test',data); } functionreg() { if(this->model('member')->isUser()) { this->Alert(‘用户名已存在’);//error类中定义了 } else { this->model('member')->addUser(); } } } 如果this->model('member')这个模型经常用到,可以在引用类的构造函数中初始化,不要每次都实例化.如: Varmember; functiontest() { this->member=this->model('member'); } 这样,应用的时候只要.this->member->addUser(); this->model(‘member’)->getUser(); 为调用入口文件相应目录下的Models文件夹下面的member.php文件里面的getUser();函数 文件:/admin/models/member.php classmemberextendsModel { functiongetUser() { //returnthis->db->GetOne("selectusernamefromuserwhereuserId=1");//这种方式处理数据库 //this->request->Get(‘test’) //this->request->Post(‘test’)这种方式获取参数,在父类中已定义 return'admin'; } //验证用户名是否已经存在 functionisUser() { userName=this->request->Post(‘username’); passWord=this->request->Post(‘password’); returnthis->db->GetOne(“selectcount(*)fromuserwhereusername=’userName’andpassword=’passWord’”); } } this->view(‘test’,data); 显示视图,调用/admin/views/test.html文件,用SmartTemplate类的方式生成data为数组 这部份请查看smartTemplate类的使用方法 转载于: 标签:PHP,db,class,MVC,PATH,model,php,DS,轻量级 (编辑:威海站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |