这篇文章主要介绍了关于php源码区分平台MVC结构的介绍,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下
主要:模型单例工厂
目录结构优化
区分平台(前台,后台....)--------------:--------------------------------------
blog
├─App
│ ├─Model 模型
│ │ └─UserModel.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 入口文件
----------------------------------------------------------------
下载查看该项目源码: https://gitee.com/NewbiesYang/young_blog
模型单例工厂
准备: 创建分支1 $ git checkout master
2 $ 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 */
6
7 class FactoryModel
8 {
9 protected static $model = array(); //存储模型类实例
10
11 /**
12 * 构造方法
13 */
14 protected function __construct()
15 {
16 }
17
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');
8
9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10 。。。
11 。。。
12 。。。
入口文件引入工厂模型类
3) 应用: 控制器中使用,如用户控制器UserController中 登录操作【Controller/UserController.class.php】1 <?php
2 /**
3 * UserController.class.php 用户控制器
4 */
5
6 class UserController extends BaseController{
7 。。。
8 。。。
9 。。。
10
11 /**
12 * 登录操作: 校验登录信息
13 */
14 public function dlogin()
15 {
16 //接收登录信息17 $data = array();
18 $data['username'] = trim($_POST['username']);
19 $data['pwd'] = trim($_POST['pwd']);
20
21 //实例化模型,调用模型方法
22 //$model = new UserModel();
23 //$result = $model->checkLoginInfo($data);
24 //替换上面两行
25 $result = FactoryModel::M('User')->checkLoginInfo($data);
26
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.php
step 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';
8
9 require_once 'Frame/FactoryModel.class.php';//模型工厂类
10
11 require_once 'Frame/BaseController.class.php'; //基础控制器类
12 require_once 'App/Controller/Home/UserController.class.php';
13
14 //实例化控制器
15 $userCtr = new UserController();
16
17 $a = !empty($_GET['a']) ? $_GET['a'] : 'login';
18
19 $userCtr -> $a();
入口文件引入类的修改
用户控制器类对登录表单视图路径引入的修改 【App/Controller/Home/UserController.class.php】1 <?php
2 /**
3 * UserController.class.php 用户控制器
4 */
5
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
2
3
4
5
登录6
7
8
9 。。。
10 。。。
11 。。。
12
13
14 layui.use('form', function(){
15 var form = layui.form;
16 });
17
18
19