PHP----MVC-v1.0, 前序

MVC: 模式化

controller 是一个php文件,由浏览器直接请求
    根据请求1:决定需要什么数据,并去调用模型文件(类),去获取该数据
    根据请求2:决定需要将数据显示在哪个视图文件中(include('header.html'))
    $obj  = new dbModel();
    $data = $obj->getAllUser();


    <a href="userController.class.php?act=show"></a>  //通过参数控制页面:要显示的内容
    userController.class.php  继承 Controller.class.php
    require_once './UserModel.class.php';
    require_once './ModelFactory.class.php';
    require_once './Controller.class.php';
    class UserController extends  Controller{
        function showAction(){
            //调用userModel
            $obj = ModelFactory::M("UserModel");
            $result = $obj->InsertUser($_POST['username'], $_POST['password']);
            include './show.html';
        }
        function detailAction(){}
        function deleteAction(){ 
            $this->gotoUrl("删除功能!", "?", 3);
        }
    }

    $ctrl = new userController();
    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';
    $active = $act . "Action";
    $active();   //调用可变函数  

Model

Model: 是一个php文件,不能直接请求,只能"被载入"而发挥作用
    根据控制器的要求去生产数据s
    方法可能需要一些参数来获取数据,连接数据库。

UserModel.class.php
    getAllUser();   //获取所有用户
    getUserById($id); //根据id获取该用户
    ...

设计:一个数据库对应一个model(UserModel.clss.php) 继承于 Model.class.php(连接数据库,常用有方法。 此类只对model调用)
Model.class.php 内容如下:
require_once "./db.class.php";
class BaseModel{
    protected $_dao = null;   //用于存储数据库工具类的实例(对象)

    function __construct(){
        $config = array(
            'host'=>'localhost',
            'port'=>3306,
            'user'=>"root",
            'poss'=>"123456",
            'charset'=>'utf8',
            'dbname'=>'test'
        );

        $this->_dao = DB::getInstance($config);
    }
}

View

View: 是一个'伪Html文件',因为其中有极简单的php代码,不应由浏览器直接请求
    结合html, css 代码,显示相应的(变量)数据
    echo data;

实图典型做法:

数据分为
    普通数据:echo #v;
    数据数据:foreach($data as $k=>$v){...}    echo $data['id'];
    对象数据:echo $obj->p1;

控制器典型做法:
1. 设定编码: 因为是控制器决定显示什么数据,也就应该由其来决定使用什么编码,一般使用一种相对固定的编码,统一设置
2. 页面的简短信息显示,及跳转功能
Controller
{
    function __construct(){
        header("content-type:text/html; charset=utf-8");
    }

    //显示一定的提示文字,然后,自动跳转
    function gotoUrl($msg, $url, $time=3){
        echo $msg;
        echo "<a href='$url'>返回</a>";
        echo "<br /> 页面将在{$time}秒之后自动 跳转";
        header("refresh: $time; url = $url"); //自动定时跳转功能
    }
}


//单例工厂类:
class ModelFactory
{
    //用于存储各个模型类的唯一实例(单例)
    static $all_model = array();

    static function M($model_name){
        //判断此模型是否存在,是否是实例
        if(!isset(static::$all_model[$model_name]) || !(static::$all_model[$model_name] instanceof $model_name)){
            static::$all_model[$model_name] = new $model_name();
        }
        return static::$all_model[$model_name];
    }
}



//test
class A{}
var_dump(ModelFactory::M(A));
echo '<br>';
var_dump(ModelFactory::M(A));

MVC 写法进级

1. 原始写法(很多的else if) 
    addAction(){
        $obj = ModelFactory::M("UserModel");
        $result = $obj->InsertUser($_POST['username'], $_POST['password']);
        echo 'add success~';
    }

    if(!empty($_GET['act']) && $_GET['act'] == Add){
        addAction();
    }else if(){}

2. 改进:函数封装(调用上面的方法)--可以将act 简写为:a
    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';
    $active = $act . "Action";
    $active();   //调用可变函数


3. 终级改进:类封装(将上面的函数封装成一个类)
    $ctrl = new userController();
    $act = !empty($_GET['act']) ? $_GET['act'] : 'Index';
    $ctrl->$active = $act . "Action";
    $ctrl->$active();   //调用可变函数

基础入口文件的设定

$p = !empty($_GET['p']) ? $_GET['p'] : 'front';   //选择平台。默认为前台
在index.php
define("PLAT", $p);    //平台
define("DS", DIRECTORY_SEPARATOR);   //目录分隔符自动匹配:win:\, unix:/
define("ROOT", __DIR__ . DS);

define("APP", ROOT . 'application' . DS);     //application 的完整路径
define("FRAMEWORK", ROOT . 'framework' . DS);
define("PLAT_PATH", APP . PLAT . DS);
define("CTRL_PATH", PLAT_PATH . "Controller" . DS);  //当前控制器所在目录
define("MODEL_PATH", PLAT_PATH . "Model" . DS); 
define("VIEW_PATH", PLAT_PATH . "View" . DS);

-示例:只留文件名
include './Application/back/view/login.html';
include VIEW_PATH . 'login.html';


-自动加载--只能对类文件自动加载
require_once FRAMEWORK . "Db.class.php";
require_once MODEL_PATH . $c . "Model.class.php";
require_once FRAMEWORK . "ModelFactory.class.php";
require_once CTRL_PATH . $c ."Controller.class.php";

自动加载代替上面几行:按需加载
function __autoload($clsss){
    $base_class = array("Db", "Model", "ModelFactory", "Controller");
    if(in_array( $class, $base_class )){
        require FRAMEWORK . $class . '.class.php';   //基础模型类
    }else if(substr($clsss, -5) == "Model"){
        require MODEL_PATH . $class . ".class.php";
    }else if(substr($clsss, -10) == "Controller"){
        require CTRL_PATH . $class . ".class.php";
    }
}

$controller_name = $c."Controller";   //会自动调用__autoload()
$ctrl = new controller_name();


$a = !empty($_GET['a']) ? $_GET['a'] : 'Index';
$active = $a . "Action";
$ctrl->$active();    //页面工作开始, 指定页面内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值