MVC总结

来源:互联网 发布:工程咨询资质取消知乎 编辑:程序博客网 时间:2024/06/07 10:45
一.MVC
MVC全名是Model View Controller,是模型(model)、视图(view)、控制器(controller)的缩写
是一种软件架构模式,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个
部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑
MVC的处理过程:
1.用户向控制器发出请求
2.控制器接收用户的请求,调用相应模型进行处理
3.模型按照控制器指令处理并返回数据
4.控制器分配数据并选取相应视图进行展示

5.视图显示数据,并通过浏览器呈现给客户

MVC开发网页思想就是把程序分为一段一段的进行书写,这样可读性和操作性比较高,每一个控制器(类文件)就是一个对象方法,让网站开发条理更加清晰,如果我们要进行某个类文件中的方法进行修改,我们就可以立马找到

这个文件从而对这个类进行修改,提高了网站开发的效率而且通过控制器操作这样不会别暴露自己的网页目录结构

我们要是想用哪个类文件中的方法,直接查找到类文件,new出来类的对象从而调用对象中的方法



二.单入口设计
单入口设计是指应用程序所有的请求都指向同一脚本文件,这个文件就是这个应用程序的单一入口
在传统的web设计中:
访问商品列表会将请求发送给goodsList.php文件
访问新闻列表会将请求发送给newsList.php文件
在单入口web设计中:
访问商品列表可以请求index.php?act=goodsList
访问新闻列表可以请求index.php?act=newsList
这里的index.php文件就是单入口文件


三.使用MVC框架模式搭建框架
1.创建目录结构
ORG      第三方扩展类和一些核心文件
model    M(模型)层目录 数据库操作
controller C(控制)层目录 控制器
view    V(视图)层目录(smarty的模板目录) 模板文件(html、tql)
public  公共资源目录
libs    Smarty引擎库(把smarty引擎解压到这里)
view_c  Smarty模板编译后目录 把模板文件和php文件结合到一起
cache   Smarty静态缓存目录(可选)
configs 模板配置文件


四.具体搭建MVC框架结构来操作数据库
1.在ORG文件夹中写Smarty引擎继承文件
在ORG中创建一个Core.class.php的smarty子类,用于初始化smarty
例:
class Core extends  Smarty{
    //创建子类的构造方法
    public function __construct(){
        //在子类使用parent访问父类被覆盖的方法而进行重写
        parent::__construct(); //构造父类
        //对父类中Smarty对象属性进行重写
        $this->template_dir = 'View';   //模板文件目录
        $this->compile_dir = 'View_C';  //模板的编译目录
        $this->config_dir = 'configs';  //模板配置目录
    }
}


2.在Controller文件夹中写一个继承ORG文件夹中的Core类的文件
在Controller文件夹中创建一个Controller.class.php的Core的子类
这个Controller文件夹中的Controller类是用于接判断客户传过来
的数据是否有这个方法来进行数据处理
例:
class Controller extends Core{
    //写一个方法来进行传过来的数据有没有这个方法来进行操作
    public function init(){
        //判断有没有传过来一个方法有的话执行没有的话执行index方法
          $action=isset($_GET['a'])?$_GET['a']:'Index';
        //进行方法调用的时候判断这个方法是否存在
        //这个函数两个参数一个是方法的对象另一个是方法
        if(method_exists($this,$action)){
            $this->$action();
        }else{
            die("没有找到{$action}方法");
        }


    }
}


3.在Model文件夹中写一个继承ORG中的文件夹中Core类的文件
在Model文件夹中创建一个Model.class.php的Core的子类
这个Model类是用来链接相应的数据库,把 这个数据库链接写成一个构造方法
例:
class Model extends Core{
    //把创建的数据库写进今天代码段 设置成受保护的
    protected static $db;
    //把调数据库写成一个构造方法
    public function __construct(){
        //如果这个属性不存在
        if(!self::$db){
            try{
                $pdo=new PDO("mysql:host=127.0.0.1;port=3306;dbname=yhshop","root","123456",array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
                $pdo->exec("set names utf8");
                self::$db=$pdo;
            }catch (PDOException $e){
                echo $e->getMessage();
            }
        }
    }
}


4.在所有文件夹的最外层创建一个index.php文件(入口文件) 所有的访问都通过这个文件来选择访问的页面
例:
//开启session
session_start();
//设置汉字编码
header("Content-Type:text/html;charset=utf-8");
//设置默认时区
date_default_timezone_set("PRC");


//配置文件的自动加载
//定义一个常量 来把目录绝对路径
//str_replace()子字符串替换 把斜杠换了 dirname()返回路径中的目录部分
define('ROOT',str_replace('\\','/',dirname(__FILE__)));


include_path配置项
1.将PHP所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。
2.当一个脚本试图用例如 fopen() 或者 gzopen()打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时
PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。
3.特殊值 .指明脚本的工作目录将被作为基准目录。但这有些危险,因为脚本的工作目录可以轻易被 chdir() 而改变。
4.在 httpd.conf 文件中中,open_basedir 可以像其它任何配置选项一样用“php_admin_value open_basedir none”的方法关闭(例如某些虚拟主机中)。
5.在 Windows 中,用分号分隔目录。在任何其它系统中用冒号分隔目录。作为 Apache 模块时,父目录中的 open_basedir 路径自动被继承。
6.用open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,
如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。


//目录文件自动加载
function __autoload($className){
    //设置包含文件的默认路径
    //set_include_path设置include_path配置项
    set_include_path(
    //get_include_path获取当前include_path配置选项
        get_include_path()
        //所有的目录拼接PATH_SEPARATOR会根据不同的操作系统自动转换不同的每个路径中想对应的分隔符windows下是分号
        .PATH_SEPARATOR.ROOT.'/Smarty'
        .PATH_SEPARATOR.ROOT.'/Smarty/plugins'
        .PATH_SEPARATOR.ROOT.'/Smarty/sysplugins'
        .PATH_SEPARATOR.ROOT.'/ORG'
        .PATH_SEPARATOR.ROOT.'/Controller'
        .PATH_SEPARATOR.ROOT.'/Model'
    );
     //如果不是.class.php后缀结尾的文件要通过if判断单独进行包含
    if(file_exists(ROOT."/Smarty/plugins/{$className}.php")){
        include_once ROOT."/Smarty/plugins/{$className}.php";
    }elseif(file_exists(ROOT."/Smarty/sysplugins/{$className}.php")){
        include_once ROOT."/Smarty/sysplugins/{$className}.php";
    }else{
     //如果是.class.php结尾的文件就之间进行包含
        include_once $className.".class.php";
    }


}


//判断控制器是否存在,并调用对应的控制器 选择控制器说白了就是选择一个相对应的类文件使用类文件中的对象来对方法进行操作
$c=isset($_GET['c'])?$_GET['c']:'Index';
$className=$c.'Controller';
if(file_exists(ROOT."/Controller/{$className}.class.php")){
    $controller=new $className();
    $controller->init();
}else{
    die('控制器不存在');
}
原创粉丝点击