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(); //页面工作开始, 指定页面内容