php is_dir 浅解用PHP实现MVC
php is_dir 浅解用PHP实现MVC
MVC是一个老生常谈的问题,是为了解决一类共同问题总结出来的一套可复用的解决方案,这是软件设计模式产生的初衷。不管是客户端还是移动端,MVC的分层设计模式解决了软件开发中的可复用、单一职责、解耦的问题php is_dir,PHP语言中的MVC设置模式也是如此。下面通过PHP语言细说MVC模式如何在PHP中应用,本文主要从如下几方面介绍:
Ø MVC的工作原理
Ø PHP开发框架
a) 开发框架的优势
b) 使用框架进行模块划分
Ø 一个简单MVC框架总体架构分析
a) URL访问方式【URL 】
b) 控制器【】
c) 视图【View】
d) 运行时【】
1、MVC 的工作原理
MVC框架图:
视图View
代表用户交互的页面、可以包含HTML界面、模板等和界面相关的元素。MVC设计模式对于视图的处理仅限于视图上数据的采集和处理,以及用户的点击、拖动等事件的处理,而不包括在视图上的业务流程处理。业务流程会交给模型层(Model)处理。
模型Model
模型层是对业务流程、状态的处理以及业务规则的指定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图的请求处理数据,返回最终的处理结果。业务模型还有一个很重要的模型–数据模型,数据模型主要指实体对象的数据保存(持久化)。比如将一张订单保存到数据库,从数据库获取订单,所有和数据库相关的操作限定在该模型中。
控制器
控制层是View层和Model层之间的一个桥梁,接收到用户的请求,将模型和视图匹配在一起,共同完成用户的请求。比如,用户点击一个链接,控制层接收到请求后,把信息传递给模型层,模型层处理完成之后返回视图给用户。
2、PHP开发框架
2.1、开发框架的优势
2.2、使用框架进行模块划分
一个典型的后台应用模块的划分
系统管理频道内容管理频道用户管理频道
模块设置操作
3、一个简单MVC框架的分析
从以下五个方面来分析
URL访问方式(URL )控制器()视图(View)模型(Model)运行时()
3.1、URL访问方式(URL )
URL使用模式(index.php/index/index/),应用的访问方式都是采用单一入口的访问方式,所有访问一个应用中的具体模块及模块中的某个操作,都需要在URL中通过入口文件后的参数来访问和执行php is_dir 浅解用PHP实现MVC,所有访问都会变成由URL的参数来统一解析和调度,格式如下:
不带参数的URL
带有参数的URL
这种采用单一入口和模式的URL访问是MVC实现的基础,作为单一入口的框架的入口.php文件则负责处理基本的信息,包括了
1)路径信息处理
路径信息会保存在$全局数组中,后面的页面需要使用到直接从$中获取即可
//模板文件中所有要的路径,htmlcss\imagelink等中用到的路径php is_dirphp is_dir 浅解用PHP实现MVC,从WEB服务器的文档根开始
$spath = ($
“”
);
if ($spath == “/” || $spath == “\”)
$spath = “”;
$ = $spath . '/'; //Web服务器根到项目的根
$ = $
“”
. '/'; //当前应用脚本文件
$ = $ . $_GET . '/'; //访问到当前模块
$ = $ . '/'; //项目的全局资源目录
$ = $ . ltrim(, './') . “views/” . . “//”; //当前应用模板的资源
2)包含框架中的函数库文件
函数库文件主要是一些常用的工具方法的集合,框架自带的.inc.php方法库包含了数据模型创建操作的一些列工具方法,可以开箱即用。此外用户也可以自定义函数库文件保存在对应模块目录下的/.inc.php位置,框架会自动引入。
//包含框架中的函数库文件 include BROPHP_PATH . 'commons/functions.inc.php'; // 包含全局的函数库文件,用户可以自己定义函数在这个文件中 $funfile = PROJECT_PATH . "commons/functions.inc.php"; if (file_exists($funfile)) include $funfile;
3)设置包含目录(类所在的全部目录)
这个步骤是()自动加载类的基础,()方法中会自动从这些目录中寻找要包含的类
//设置包含目录(类所在的全部目录), PATH_SEPARATOR 分隔符号 Linux(:) Windows(;) $include_path = get_include_path(); //原基目录 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "bases/"; //框架中基类所在的目录 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "classes/"; //框架中扩展类的目录 $include_path .= PATH_SEPARATOR . BROPHP_PATH . "libs/"; //模板Smarty所在的目录 $include_path .= PATH_SEPARATOR . PROJECT_PATH . "classes/"; //项目中用的到的工具类 $controlerpath = PROJECT_PATH . "runtime/controls/" . TMPPATH; //生成控制器所在的路径 $include_path .= PATH_SEPARATOR . $controlerpath; //当前应用的控制类所在的目录 //设置include包含文件所在的所有目录 set_include_path($include_path);
4)()自动加载类
()魔术方法是在用户创建一个没有包含的类的对象之前会调用,所以重写这个方法,在这个方法中处理类文件的包含,省去了类文件包含的工作,当然类名需要符合一定的规则才能使用自动包含,框架定义了类名的规则为“首字母大小的类名.clsss.php”
//自动加载类 function __autoload($className) { if ($className == "memcache") { //如果是系统的Memcache类则不包含 return; } else if ($className == "Smarty") { //如果类名是Smarty类,则直接包含 include "Smarty.class.php"; } else { //如果是其他类,将类名转为小写 include strtolower($className) . ".class.php"; } Debug::addmsg(" $className 类", 1); //在debug中显示自动包含的类 }
解析处理URL
解析处理URL步骤调用的是::();
/** * URL路由,转为PATHINFO的格式 */static function parseUrl() { if (isset($_SERVER['PATH_INFO'])) { //获取 pathinfo $pathinfo = explode('/', trim($_SERVER['PATH_INFO'], "/")); // 获取 control $_GET['m'] = (!empty($pathinfo[0]) ? $pathinfo[0] : 'index'); array_shift($pathinfo); //将数组开头的单元移出数组 // 获取 action $_GET['a'] = (!empty($pathinfo[0]) ? $pathinfo[0] : 'index'); array_shift($pathinfo); //再将将数组开头的单元移出数组 for ($i = 0; $i < count($pathinfo); $i += 2) { $_GET[$pathinfo[$i]] = $pathinfo[$i + 1]; } } else { $_GET["m"] = (!empty($_GET['m']) ? $_GET['m'] : 'index'); //默认是index模块 $_GET["a"] = (!empty($_GET['a']) ? $_GET['a'] : 'index'); //默认是index动作 if ($_SERVER["QUERY_STRING"]) { $m = $_GET["m"]; unset($_GET["m"]); //去除数组中的m $a = $_GET["a"]; unset($_GET["a"]); //去除数组中的a $query = http_build_query($_GET); //形成0=foo&1=bar&2=baz&3=boom&cow=milk格式 //组成新的URL $url = $_SERVER["SCRIPT_NAME"] . "/{$m}/{$a}/" . str_replace(array("&", "="), "/", $query); header("Location:" . $url); } } }
访问login/index,解析保存在全局的GET数组中的信息如下:
m -> 表示控制器
a -> 表示操作
有了这些信息,动态创建控制器,发起对应的流程
$className = ucfirst($_GET["m"]) . "Action"; $controler = new $className(); $controler->run();
3.2、控制器()
1)控制器的声明
功能模块的控制器类保存在目录中,类名和模块名相同,下面是登录模块,定义一个Login类(类的首字母需要大写)保存的文件名为login.class.php
class Login extends Action { function __construct() { parent::__construct(); } function index() {//登陆页面 $GLOBALS['debug'] = 0; $this->display(); } function islogin() { if ($_POST['user_username'] == null && $_POST['user_password'] == null) {//如果用户名为空 $this->error('用户名和密码不能为空', 1, ''); } $_POST['user_password'] = md5($_POST['user_password']); $_POST['user_repassword'] = md5($_POST['user_repassword']); if ($_POST['user_repassword'] != $_POST['user_password']) {//如果用户输入的两次密码不一致$this->error('两次密码不一致', 1, ''); } $user = D('user'); $date = $user->field('uid,user_password')->where(array('user_username' => $_POST['user_username']))->find(); $_POST['uid'] = $date['uid']; if ($_POST['user_password'] != $date['user_password']) {//如果输入的密码与数据库密码不匹配 $this->error('密码不正确', 1, ''); } if (strtoupper($_POST['code']) != $_SESSION['code']) {//如果输入的验证码不正确 $this->error('验证码输入不正确', 1, ''); } $_SESSION = $_POST;//把posts所有的数据压入session $date = $user->query('SELECT free_user_group.group_muser,free_user_group.group_mweb,free_user_group.group_marticle,free_user_group.group_sendarticle,free_user_group.group_mimage,free_user_group.group_sendcomment,free_user_group.group_sendmessage,free_user.user_lock FROM free_user,free_user_group WHERE free_user.uid=' . $_SESSION['uid'] . ' AND free_user.gid=free_user_group.gid', 'select'); if ($date[0]['user_lock']) { $this->error('您的帐号已被锁定,请与管理员联系后再登录', 3, 'index/index'); } else { if ($date[0]['group_muser'] || $date[0]['group_marticle'] || $date[0]['group_mweb'] || $date[0]['group_mimage']) { //查询数据库中是否开启自动记录操作 $opernote = D('foreground'); //$_SESSION['oper']=D('OperDate'); $isOpenNote = $opernote->where(array('fid' => '1'))->field('operateNotes')->find(); //$_SESSION['operAuthor']=$operAuthior->where(array('id'=>'1'))->find(); $_SESSION['isOpenNotes'] = $isOpenNote['operateNotes']; $_SESSION['islogin'] = true; $_SESSION = array_merge($date[0], $_SESSION); $user->where($_SESSION['uid'])->update('user_onlinestatus=user_onlinestatus+1'); $this->success('登陆成功', 1, 'index/index'); } else { $this->error('您的权限不够无法进入后台', 1, ''); } } } function logout() {//退出时销毁session $user = D('user'); $_SESSION['islogin'] = false; $_SESSION = array(); if (isset($_COOKIE[session_name()])) { setCookie(session_name(), '', time() - 3600, '/'); } session_destroy(); $this->redirect('index'); } function code() {//显示验证码 echo new Vcode(); } }
.class.php 类
class Common extends Action { function init() { if (!(isset($_SESSION['islogin']) && $_SESSION['islogin'] == true)) { $this->redirect("login/index"); } $this->assign('session', $_SESSION); } }
2) 操作的声明
每个操作对应的是控制器中的一个方法,比如在上面的Login控制器中
3.3、视图(View)
视图的显示是基于模板引擎的php is_dir,继承了类,并且重写了,,, 方法。
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299
资源库 - 资源分享下载网 » php is_dir 浅解用PHP实现MVC
常见问题FAQ
- 关于资源售价和售后服务的说明?
- 代码有没有售后服务和技术支持?
- 有没有搭建服务?
- 链接地址失效了怎么办?
- 关于解压密码