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 类的使用方法

  • 相关阅读:
    使用 asp.net mvc和 jQuery UI 控件包
    ServiceStack.Redis 使用教程
    HTC T8878刷机手册
    Entity Framework CodeFirst 文章汇集
    2011年Mono发展历程
    日志管理实用程序LogExpert
    使用 NuGet 管理项目库
    WCF 4.0路由服务Routing Service
    精进不休 .NET 4.0 (1) asp.net 4.0 新特性之web.config的改进, ViewStateMode, ClientIDMode, EnablePersistedSelection, 控件的其它一些改进
    精进不休 .NET 4.0 (7) ADO.NET Entity Framework 4.0 新特性
  • 原文地址:https://www.cnblogs.com/Peacha/p/3415898.html
Copyright © 2011-2022 走看看