您的位置:首页 > 编程语言 > PHP开发

PHP下的MVC

2016-03-02 09:39 621 查看
学习资源来自于慕课网~~
先来一个简单的Demo
SimpleDemo

控制器C testController.class.php
<?php
class testController {
function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
$testModel = new testModel();
$data = $testModel->get();
$testView = new testView();
$testView->display($data);
}
}
?>


模型M testModel.class.php
<?php
// Model 模型:它是从数据库或接口等地方获取数据源,并且进行数据处理的物件
class testModel {
function get() { //模型的作用是获取数据并处理返回数据
return "Hello World";
}
}
?>


视图V testView.class.php
<?php
class testView {
function display($data) {
echo $data;
}
}
?>


使用控制器对模型进行调用,获取数据,通过视图进行展示:
test.php
<?php
/***
第一步 浏览者 -> 调用控制器,对他发出指令
第二步 控制器 -> 按指令选取一个合适的模型
第三步 模型   -> 按控制器指令取相应数据
第四步 控制器 -> 按指令选取相应视图
第五步 视图   -> 把第三步取到的数据按用户想要的样子显示出来
***/

require_once('testController.class.php');
require_once('testModel.class.php');
require_once('testView.class.php');

$testController = new testController();
$testController->show();
?>


对上述的SimpleDemo进行改进:
目录结构:
控制器存储在 mvc/libs/Controller 下;模型存储在 mvc/libs/Model 下;视图存储在 mvc/libs/View 下;配置文件 config.php 存储在 mvc 下;index.php、function.php 存储在mvc下。
其中 function.php :
<?php
function C($name, $method) { //原则上控制器的方法是不能有自己的参数的,否则不符合MVC的架构规范的
require_once('/libs/Controller/'.$name.'Controller.class.php');
//$testController = new testController();
//$testController->show();

//eval 把字符串转化为可执行的程序
//eval('$obj = new '.$name.'Controller(); $obj->'.$method.'();');

//eval() 函数调用简单但是不安全
// 可用下面代码代替:
$controller = $name.'Controller';
$obj = new $controller();
$obj->$method();
}

//C('test','show');

function M($name) { //模型的方法一般带有参数,所以我们不把方法封装起来
require_once('/libs/Model/'.$name.'Model.class.php');
//eval('$obj = new '.$name.'Model();');

$model = $name.'Model';
$obj = new $model();
return $obj;
}

function V($name) {
require_once('/libs/View/'.$name.'View.class.php');
//eval('$obj = new '.$name.'View();');

$view = $name.'View';
$obj = new $view();
return $obj;
}

//防止非法字符的输入
function daddslashes($str) {
return (!get_magic_quotes_gpc())?addslashes($str):$str;
}
?>


mvc/libs/Controller/testController.class.php
<?php
class testController {
function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
$testModel = M('test');
$data = $testModel->get();
$testView = V('test');
$testView->display($data);
}
}
?>


mvc/libs/Model/testModel.class.php
<?php
// Model 模型:它是从数据库或接口等地方获取数据源,并且进行数据处理的物件
class testModel {
function get() { //模型的作用是获取数据并处理返回数据
return "Hello World";
}
}
?>


mvc/libs/View/testView.class.php
<?php
class testView {
function display($data) {
echo $data;
}
}
?>


index.php (单一入口程序)
<?php
//url形式 index.php?controller=控制器名称&method=方法名
require_once('function.php');

//为了防止非法用户访问 控制器名和方法名,我们定义允许访问的控制器和方法
$controllerAllow = array('test','index');
$methodAllow = array('test','index', 'show');

$controller = in_array($_GET['controller'], $controllerAllow) ? daddslashes($_GET['controller']) : 'index';
$method = in_array($_GET['method'], $methodAllow) ? daddslashes($_GET['method']) : 'index';
C($controller, $method);
?>


使用Smarty视图引擎,对上述进行改进:
目录结构如下:





进行function.php进行修改,添加引入第三方类库的方法 ORG:
<?php
function C($name, $method) { //原则上控制器的方法是不能有自己的参数的,否则不符合MVC的架构规范的
require_once('/libs/Controller/'.$name.'Controller.class.php');
//$testController = new testController();
//$testController->show();

//eval 把字符串转化为可执行的程序
//eval('$obj = new '.$name.'Controller(); $obj->'.$method.'();');

//eval() 函数调用简单但是不安全
// 可用下面代码代替:
$controller = $name.'Controller';
$obj = new $controller();
$obj->$method();
}

//C('test','show');

function M($name) { //模型的方法一般带有参数,所以我们不把方法封装起来
require_once('/libs/Model/'.$name.'Model.class.php');
//eval('$obj = new '.$name.'Model();');

$model = $name.'Model';
$obj = new $model();
return $obj;
}

function V($name) {
require_once('/libs/View/'.$name.'View.class.php');
//eval('$obj = new '.$name.'View();');

$view = $name.'View';
$obj = new $view();
return $obj;
}

//防止非法字符的输入
function daddslashes($str) {
return (!get_magic_quotes_gpc())?addslashes($str):$str;
}

function ORG($path, $name, $params=array()) { //path 是路径,name是第三方类名,params是该类初始化的时候需要指定、赋值的属性,格式为array(属性名=>属性值,属性名2=>属性值2……)
require_once('libs/ORG/'.$path.$name.'.class.php');
//eval('$obj = new '.$name.'();');
$obj = new $name();
if(!empty($params)) {
foreach($params as $key=>$value) {
//eval('$obj->'.$key.'=\''.$value.'\';');
$obj->$key = $value;
}
}
return $obj;
}
?>


config.php 保存Smarty属性初始化数据
<?php
$viewconfig = array('left_delimiter'=>'{','right_delimiter'=>'}','template_dir'=>'tpl','compile_dir'=>'template_c');
?>


index.php 对Smarty初始化,调用控制器
<?php
//url形式 index.php?controller=控制器名称&method=方法名
require_once('function.php');
require_once('config.php');

//为了防止非法用户访问 控制器名和方法名,我们定义允许访问的控制器和方法
/*$controllerAllow = array('test','index');
$methodAllow = array('test','index', 'show');

$controller = in_array($_GET['controller'], $controllerAllow) ? daddslashes($_GET['controller']) : 'index';
$method = in_array($_GET['method'], $methodAllow) ? daddslashes($_GET['method']) : 'index';
C($controller, $method);*/

//使用Smarty
$view = ORG('Smarty/','Smarty', $viewconfig);

$controller = $_GET['controller'];
$method = $_GET['method'];
C($controller, $method);
?>


testController.class.php 调用模型testModel.class.php获取数据,并使用Smarty注册变量,使用test.tpl模板进行视图的显示.
<?php
class testController {
function show() { //控制器的作用是调用模型,并调用视图,将模型产生的数据传递给视图,并让相关视图去显示
/*$testModel = M('test');
$data = $testModel->get();
$testView = V('test');
$testView->display($data);*/

//使用Smarty
global $view;
$testModel = M('test');
$data = $testModel->get();
$view->assign('str',$data);
$view->display('test.tpl');
}
}
?>


test.tpl 视图
{$str}

显示模型获取而来的数据,实现业务逻辑层与界面层的分离。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: