zoukankan      html  css  js  c++  java
  • 自己编写基于MVC的轻量级PHP框架

    WEB开发已有三年,每次都写重复的东西因此,想自己写一下框架,以后开发方便.
    本人之前asp.NET一年开发,jsp半年,可是后来因为工作的原故换成PHP.其实很不喜欢PHP的语法.还有PHP的函数名,每回都忘记..还是喜欢C#JAVA的语法,...不过PHPPHP的优点,不像ASP.NET那样封装了大量的东西,PHP更简单,更自由吧.还有应该就是PHP的开源组合
    写这编文章主要是因为那些东西要写给别人看,顺便发表了.高手看了别笑,菜鸟自己注意辨别,别被我的错误观点误导.
    文章中的代码下载
    .文件结构
     index.php 入口文件
    ├ class 类存放的文件夹
       ├ base.class.php 基类
       ├ error.class.php 错误处理类
       ├ parms.class.php 获取参数类
    ├ control.class.php 控制类
    ├ model.class.php 模型类
    ├ template smartTemplate 类存放文件夹
    ├ db adodb 类存放文件夹
    ├ includes 包含文件类
     defines.inc.php 定义各路径文件
       ├ frameword.inc.php 框架处理文件
       ├ router.inc.php 路由文件,跟据参数,跳转不同路径
    ├ models 模式存放路径
    ├ views 模版文件保存路径
    ├ controls 存放控制类的文件夹
    ├ config.php 配置文件
    ├ admin 后台


    .简单类图

    入口文件,index.php
    <?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');

    echo request->Get('a');//参数的获取GET方法
    request->Post(‘a’);//获取POST参数

    ?>

    路径定义文件 defines.inc.php
    <?php
    /*
    */
    // no direct access
    defined( 'EXEC' ) or die( 'Restricted access' ); //如果单独执行这个文件,将不能执行

    //站点路径
    define( 'PATH_SITE', PATH_ROOT );
    //包含文件路径
    define( 'PATH_INCLUDE', PATH_ROOT.DS.'includes');
    //类文件路径
    define( 'PATH_CLASS', PATH_ROOT.DS.'class' );
    //配置文件路径
    define( 'PATH_CONFIG', PATH_ROOT );

    ?>

    框架文件路径 frameword.inc.php
    f
    <?php

    // no direct access
    defined( 'EXEC' ) or die( 'Restricted access' );

    //load error class
    require_once( PATH_CLASS.DS.'error.class.php'); //包含错误处理文件
    //load base class
    require_once( PATH_CLASS.DS.'base.class.php' ); //包含基类文件

    //实例化基类
    load=new Base();

    //实列化请求类 用于获取GETPOST
    //加截一个自己写的类的方法
    //把自己写的类放在class 文件夹下面,文件名的格式为demo.class.php
    //那么类名就为 class demo{}
    //实便化的方式为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
    <?php

    // no direct access
    defined( 'EXEC' ) or die( 'Restricted access' );

    class Base extends Error
    {
     
     var path_root ='';
     var path_class ='';
     var path_control ='';

     /*/构造函数
     *@parame path 应用路径
     *return null
     */
     public function Base() 
     {
     this->path_root =PATH_ROOT;
     this->path_class =PATH_CLASS;
     this->path_control=PATH_BASE.DS.'controls';
     }

     //加载模型
     //load model
     function model(name) 
     {
     include_once (this->path_model.DS.name.'.php');
     
     model=null;
     if(model==null)
     {
     model=new name();
     }
     return model;
     
     }

     //output page
     /*
     *@paramater name file name
     *@paramater data replace
     *
     */
     function view(name,data) 
     {
     Template=self::template(file);
     Template->output(data);
     unset(Template);
     }
     
     //create database connection
     function database()
     {
     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("Could not connect to the database.");
     }else{
     this->db->Execute("set names 'utf8'");
     return this->db;
     }
     }
     
     //create template 
     function template(file)
     {
     include_once (PATH_CLASS.DS.'template'.DS.'class.smarttemplate.php');
     Template = new Smarttemplate(file);
     Template->template_dir=PATH_BASE.self::config('template_dir');
     Template->cache_dir =PATH_BASE.self::config('cache_dir');
     
     return Template;
     }
     
     //import class 
     function library(className) 
     {
     if(empty(className))
     {
     return null;
     exit();
     }
     else
     {
     require_once(PATH_CLASS.DS.className.'.class.php');
     return new className();

     }
     }
     
     //return config value
     function config(parameter)
     {
     require_once(PATH_CONFIG.DS.'config.php');

     return CONFIG::Ini()->parameter;

     }
     
    }


    ?>

    控制器父类control.class.php
     <?php
    class Control extends Base
    {
     var request;
     function Control() 
     {
     this->request=this->library('params');
     }

     //output page
     /*
     *@paramater name file name
     *@paramater data replace
     *
     */
     function view(name,data='') 
     {
     Template=this->template(name.'.html');
     Template->assign('site_root',this->config('site_root'));

     Template->assign(data);
     Template->output();
     unset(Template);
     }

     //load model
     function model(name) 
     {
     
     include_once (PATH_BASE.DS.'models'.DS.name.'.php');
     
     if(this->model==null)
     {
     this->model=new name();
     }
     return this->model;
     
     }

    }

    ?>

    模型父类 model.class.php
     <?php

    class Model extends Base
    {
     var request;
     var db;
     function Model() 
     {
     this->request=this->library('params');
     }

     //create database connection
     function database()
     {
     if(this->db!=null)
     {
     return this->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("Could not connect to the database.");
     }else{
     this->db->Execute("set names 'utf8'");
     return this->db;
     }
     }

    }

    ?>

    路由文件, router.inc.php
    跟据URL,指定到相应的控制器,跟据网站的URL表现形式编写
    <?php
    // no direct access
    defined( 'EXEC' ) or die( 'Restricted access' );

    //实例化类
    load=new Base();

    //实列化请求类 用于获取GETPOST
    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=new option();

    if(empty(task))
    {
     Control->index();
    }
    else
    {
     Control->task();
    }


    ?>

    ,使用方法
    使用方法.
    视图V:在把模板文件放在VIEW文件夹里面.命名方式为,login.html
    控制C:把要怎么处理的文件放在control文件夹里面,
    格式为.demo.php 
    class demo extends Control
    {
    function edit()
    {
    data=this->user->issuer();//调用模型
    this->view(‘login’,data);//这个LOGIN为视图中的login.html文件
    }
    }
    模型 M:把文件放在 model文件夹里面.格式为.user.php

    class user extends Model
    {
    function issuer()
    {
    数据库或底层的操作,返回结果
    }
    }
    自定义类的调用,把类放在Class文件夹下面.格式为session.class.php
    先实例化.
    session=load->library(‘session’);
    然后再调用类中的函数
    session->sessionId();
    例子:
    如下URL: http://127.0.0.1/com/admin/?option=test&task=getUser (:这里的URL格式可以在router.inc.php里面修改.同时为了让不同目录的地址格式不一样,比如前台和后台,因些,router.inc.php规则放在了入口文件的includes目录下面则会调用/admin/control/文件夹下面的test.php文件test类的getUser 函数,如果task参数为空,则调用index函数.
    文件:/admin/control/test.php
    <?php
    class test extends Control
    {
    function index()
    {

    function getUser()
    {
    data['user']=this->model('member')->getUser();
    this->view('test',data);

    function reg()
    {
    if(this->model('member')->isUser())
    {
    this->Alert(‘用户名已存在’); //error类中定义了
    }
    else
    {
    this->model('member')->addUser();
    }
    }
    }
    ?>
    如果this->model('member')这个模型经常用到,可以在引用类的构造函数中初始化,不要每次都实例化.:
    Var member;
    function test()
    {
    this->member=this->model('member');
    }
    这样,应用的时候只要. this->member ->addUser();
    this->model(‘member’)->getUser();
    为调用入口文件相应目录下的Models 文件夹下面的member.php文件里面的getUser();函数
    文件:/admin/models/member.php
    <?php
    class member extends Model
    {
    function getUser()
    {
    //return this->db->GetOne("select username from user where userId=1");//这种方式处理数据库
    //this->request->Get(‘test’) 
    //this->request->Post(‘test’) 这种方式获取参数,在父类中已定义 
    return 'admin';

    //验证用户名是否已经存在
    function isUser()
    {
    userName=this->request->Post(‘username’);
    passWord=this->request->Post(‘password’);
    return this->db->GetOne(“select count(*) from user where username=’userName’ and password=’passWord’”);
    }
    }
    ?>
    this->view(‘test’,data); 
    显示视图,调用/admin/views/test.html文件,SmartTemplate 类的方式生成 data 为数组
    这部份请查看smartTemplate 类的使用方法

  • 相关阅读:
    web开发发送短信实现最简单的接口
    2分钟学会ajax 入门ajax必备
    基于注册登陆简单的使用django认证系统
    Django 发送邮件
    关于python开始写项目创建一个虚拟环境
    pycharm使用bootstrap组件方法
    linux安装配置python环境以及虚拟环境和django下载
    luffy项目搭建流程(Django前后端分离项目范本)
    python微信服务号关注授权、消息推送流程
    Celery—分布式的异步任务处理系统
  • 原文地址:https://www.cnblogs.com/Peacha/p/3415898.html
Copyright © 2011-2022 走看看