首页 > 编程 > PHP > 正文

php源码之区分平台MVC结构的介绍

2020-03-22 18:02:29
字体:
来源:转载
供稿:网友
这篇文章主要介绍了关于php源码区分平台MVC结构的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

主要:

模型单例工厂

目录结构优化

区分平台(前台,后台....)

--------------:--------------------------------------├─App│ ├─Model 模型│ │ └─UserModel.html' target='_blank'>class.php 用户模型类 │ ├─View 视图│ │ ├─Back后台│ │ │ └─Index│ │ │ └─index.html 后台首页面│ │ └─Home前台│ │ └─User 用户视图目录│ │ └─login.html 登录表单页面│ ├─Controller 控制器│ │ ├─Back后台│ │ │ └─IndexController.class.php 后台首页控制器│ │ └─Home前台│ │ └─UserController.class.php 用户控制器├─Public 静态公共文件(js,css,images)│ ├─Plugins 插件│ │ └─layui 前端框架插件│ ├─Back后台│ │ ├─js/ js文件│ │ ├─css/ css样式文件│ │ └─image img图片 │ └─Home前台│ ├─js/ js文件│ ├─css/ css样式文件│ └─image img图片 ├─Frame 公共使用的类│ ├─BaseModel.class.php 数据库连接类│ ├─BaseController.class.php 控制器公共操作(设置编码,信息跳转)│ ├─FactoryModel.class.php 模型工厂类│ └─MySQLDB.class.php 数据库操作工具类└─index.php 入口文件----------------------------------------------------------------

下载查看该项目源码: http://gitee.com/NewbiesYang/young_blog

模型单例工厂

准备: 创建分支

1 $ git checkout master2 $ git checkout -b folder-model-app 

说明:

1)程序中3行 。。。 表示省略的代码。从前面或源码中可查看

2) 【XXX/XXX】表示项目文件相对路径

思路:

问题: 项目中模型操作数据表,一个动作可能就要操作一次数据库,一次请求多个动作,每个动作都需要去实例化对应模型

解决想法: 创建一个模型类单例工厂
实现: 创建单例的模型类 FactoryModel.class.php
属性$model=array(); 存储模型类实例
方法: M($cmodelName, array $conf=null) 实例化模型类
使用: 控制器中使用模型类实例:$model=FactoryModel::M( 模型名称 )

代码实现

1) 创建模型单例工厂 【Frame/FactoryModel.class.php】

 1 ?php  2 /**  3 * 单例模型工厂类  4 * User: young  5 */  7 class FactoryModel  8 {  9 protected static $model = array(); //存储模型类实例 11 /** 12 * 构造方法 13 */ 14 protected function __construct() 15 { 16 } 18 /* 19 * 传递一个模型类的类名,就返回该类的一个单例实例对象 20 *@param string $modelName 模型类的类名 21 *@param array $conf 数据库配置信息 22 *@return object 传入模型类的实例(单例) 23 */ 24 public static function M($modelName, array $conf=null) 25 { 26 $modelName = $modelName. Model  27 if(empty(static::$model[$modelName]) || !(static::$model[$modelName] instanceof $modelName)){ 28 static::$model[$modelName] = new $modelName($conf); 29 } 30 return static::$model[$modelName]; 31 } 32 }

2) 引入该类文件 【index.php】

 1 ?php  2 /**  3 * 入口文件  4 */  5 require_once Frame/Db.class.php //数据库操作类  6 require_once Frame/BaseModel.class.php //基础模型类  7 require_once( Model/UserModel.class.php  9 require_once Frame/FactoryModel.class.php //模型工厂类 10 。。。 11 。。。 12 。。。

入口文件引入工厂模型类

3) 应用: 控制器中使用,如用户控制器UserController中 登录操作【Controller/UserController.class.php】

 1 ?php  2 /**  3 * UserController.class.php 用户控制器  4 */  6 class UserController extends BaseController{  7 。。。  8 。。。  9 。。。 11 /** 12 * 登录操作: 校验登录信息 13 */ 14 public function dlogin() 15 { 16 //接收登录信息17 $data = array(); 18 $data[ username ] = trim($_POST[ username  19 $data[ pwd ] = trim($_POST[ pwd  21 //实例化模型,调用模型方法 22 //$model = new UserModel(); 23 //$result = $model- checkLoginInfo($data); 24 //替换上面两行 25 $result = FactoryModel::M( User )- checkLoginInfo($data); 27 //跳转提示 28 if($result){ 29 $this- msg( 登录成功! , ?a=index ,3); 30 } else { 31 $this- msg( 用户名或密码不正确!!  32 } 33 } 34 }

4) 测试程序运行,http://www.test.com/blog/index.php 登录测试结果与前面一致。暂时先提交代码

1 git add -2 git commit -m 完成模型工厂类 
目录结构优化 思路

多个平台(模块):前后,后台
MVC结构分平台
C: Controllers/Home Controllers/Admin .....
V: Views/Home Views/Admin .....
M: 操作数据表一般模块共用
公共资源目录Public: Public/Home Public/Admin .....
目录结构变化,所有载入类,视图的路径做相应变化

代码实现

1)操作步骤

1)目录构建: step 1: 根目录下创建目录App, 将Model目录,View目录,Controller目录放大App目录下 既根目录只有: App/ Public/ Frame/ index.phpstep 2: 在Controller目录中,创建Back目录和Home目录。将UserController控制器类文件放入Home目录中step 3: 在View目录中,创建Back目录和Home目录。将login.html文件放入Home目录中step 4: 在Public目录中,创建Back目录,Home目录,Plugins目录。将js,images,css目录放入Home目录中,公共插件放入对应的Plugins目录中2)文件引入修改:step 5: index.php入口文件对UserCotroller类的引入路径修改step 6:UserController类中对视图login.html的include路径的修改step 7: 视图login.html中对css和js路径的引入

操作步骤思路

2) 具体代码修改操作

入口文件引入类路径修改【index.php】 主要是用户模型类和用户控制器类路径引入修改

 1 ?php  2 /**  3 * 入口文件  4 */  5 require_once Frame/Db.class.php //数据库操作类  6 require_once Frame/BaseModel.class.php //基础模型类  7 require_once App/Model/UserModel.class.php  9 require_once Frame/FactoryModel.class.php //模型工厂类 11 require_once Frame/BaseController.class.php //基础控制器类 12 require_once App/Controller/Home/UserController.class.php  14 //实例化控制器 15 $userCtr = new UserController(); 17 $a = !empty($_GET[ a ]) ? $_GET[ a ] : login  19 $userCtr - $a();

入口文件引入类的修改

用户控制器类对登录表单视图路径引入的修改 【App/Controller/Home/UserController.class.php】

 1 ?php  2 /**  3 * UserController.class.php 用户控制器  4 */  6 class UserController extends BaseController{  7 /**  8 * 展示登录界面  9 * @access public10 */ 11 public function login() 12 { 13 include App/View/Home/User/login.html  14 } 15 。。。 16 。。。 17 。。。

用户控制器展示登录界面修改

登录表单视图 【App/View/Home/User/login.html】 对静态资源路径的修改

 1 !DOCTYPE html  2 html lang= zh-CN  3 head  4 meta charset= UTF-8  5 title 登录 /title  6 link rel= stylesheet type= text/css href= public/plugins/layui/css/layui.css  7 link rel= stylesheet type= text/css href= public/Home/css/style.css  8 /head  9 。。。 10 。。。 11 。。。 12 script type= text/javascript src= public/plugins/layui/layui.js /script  13 script  14 layui.use( form , function(){ 15 var form = layui.form; 16 }); 17 /script  18 /body  19 /html 

登录表单视图

效果及提交代码

提交保存代码

1 git add -A2 git commit -m 目录结构优化 
区分平台(前台,后台....) 思路

实现根据平台的不同进行不同的操作

用户点击页面请求,随着url发送3个参数: p=平台 c=控制器 a=动作
入口文件接收get数据就可以知道: 平台, 控制器, 动作

代码实现

1) 操作步骤:

1)入口文件平台区分: step 1: 入口-登录页面提交的action= ?p=Home c=User a=dlogin  step 2: 入口文件index.php 接收$_GET step 3: 登录判断成功跳转地址: $this- msg( 登录成功! , ?p=Admin c=Index a=index ,3);2) 后台首页: step 1: 静态css,js,img文件放置 Public/Admin/ step 2: 创建后台首页控制器类, index() 载入后台首页视图文件 step 3: View/Admin/Index/index.html 修正css等静态文件路

操作步骤思路

2)登录表单提交action=“?p=Home c=User a=dlogin” 【App/View/Home/User/login.html】

 1 !DOCTYPE html  2 html lang= zh-CN  3 head  4 meta charset= UTF-8  5 title 登录 /title  6 link rel= stylesheet type= text/css href= public/plugins/layui/css/layui.css  7 link rel= stylesheet type= text/css href= public/Home/css/style.css  8 /head  9 body  10 p >

登录表单form提交action修改

3) 入口文件区分平台 【index.php】

 ?php * 入口文件  $p = !empty($_GET[ p ]) ? $_GET[ p ] : Home //平台 $c = !empty($_GET[ c ]) ? $_GET[ c ] : User //控制器 $a = !empty($_GET[ a ]) ? $_GET[ a ] : login //动作 require_once Frame/Db.class.php //数据库操作类 require_once Frame/BaseModel.class.php //基础模型类 require_once App/Model/UserModel.class.php  require_once Frame/FactoryModel.class.php //模型工厂类 require_once Frame/BaseController.class.php //基础控制器类 require_once App/Controller/ .$p. / .$c. Controller.class.php  $ctr = $c. Controller //实例化控制器 $userCtr = new $ctr();$userCtr - $a();

用户控制器登录操作,登录成功跳转到后台首页 【App/Controller/Home/UserController.class.php】

 1 ?php  2 /**  3 * UserController.class.php 用户控制器  4 */  6 class UserController extends BaseController{  7 。。。  8 。。。  9 。。。 10 /** 11 * 登录操作: 校验登录信息 12 */ 13 public function dlogin() 14 { 15 //接收登录信息 16 $data = array(); 17 $data[ username ] = trim($_POST[ username 18 $data[ pwd ] = trim($_POST[ pwd  20 //实例化模型,调用模型方法 21 $result = FactoryModel::M( User )- checkLoginInfo($data); 23 //跳转提示 24 if($result){25 $this- msg( 登录成功! , ?p=Admin c=Index a=index ,3);26 } else { 27 $this- msg( 用户名或密码不正确!!  28 } 29 } 30 }

登录操作成功后跳转路径修改

测试

1)模板准备:

准备后台视图模板程序。可以自己写前端视图模板程序,也可以到网上下载别人写好的前端模板,如到 模板之家 选择所需求的 前台,后台模板

寻找模板: www.mycodes.net

2) 将后台模板视图的静态资源文件(如 js, css,image)拷贝到 【Public/admin/】目录下

3) 创建后台首页控制器 【App/Controller/Admin/IndexController.class.php】

 1 ?php  2 /**  3 * IndexController控制器类  4 * 后台相关操作  5 * User: young  6 */  8 class IndexController extends BaseController  10 //展示后台首页 11 public function index() 12 { 13 include App/View/Admin/Index/index.html  14 } 15 }

4) 创建后台首页视图 【App/View/Admin/Index/index.html】

 1 !doctype html  2 html  3 head  4 meta charset= UTF-8  5 title 后台管理 /title  6 link rel= stylesheet type= text/css href= ./Public/Admin/css/common.css /  7 link rel= stylesheet type= text/css href= ./Public/Admin/css/main.css /  8 script type= text/javascript src= ./Public/Admin/js/libs/modernizr.min.js /script  9 script type= text/javascript src= ./Public//home/js/jquery1.42.min.js /script  10 /head  11 body  14 p >

后台首页视图

效果及提交代码

代码提交,推送

1 $ git add -A2 $ git commit -m 区分平台,实现后台首页 3 $ git checkout master4 $ git merge folder-model-app 5 $ git push origin master

小结: 根据平台进一步优化目录结构,制作模型的单例工厂,实现后台首页

提出问题

1. 项目中可以看到 include或require的文件路径很长,容易出错,也不便于使用 == 如何更加简单引入且不易出错

2. 写一个类,就要到入口文件引入一次, 比较麻烦 == 如何实现自动加载类

3. 随着类的引入增加,入口文件代码量会越来越大 == 如何 封装,简化入口文件

4. 现在项目中任何一个目录,都可以随意访问 == 如何加强安全访问,限制目录的访问

下一步:常量使用,自动加载类实现,入口封装,限制目录访问

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP !

相关推荐:

php源码之搭建站点实现登录页面的方法

php源码之实现单入口MVC结构的方法

以上就是php源码之区分平台MVC结构的介绍的详细内容,PHP教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表