CI框架实现框架前后端分离的方法详解


Posted in PHP onDecember 30, 2016

本文实例分析了CI框架实现框架前后端分离的方法。分享给大家供大家参考,具体如下:

我们在使用CI框架开发中(或者使用所有的其他框架开发中),总是习惯于将所开发项目的前端和后台分离开来,将各自的控制器、模型或视图放到不同的文件夹中。在这一点上ThinkPHP框架要比CI框架更要方便一些。这篇博文我们就讲述如何实现根据CI框架开发将前后端实现分离。(本文以本人开发的Pkadmin后台管理系统为例,Pkadmin后台管理系统是基于Codeigniter_v3.1.0框架和Olive Admin后台模版进行开发的,在这里就不过多的介绍,感情趣的朋友可以到Github进行查看欢迎大家指正相互学习。

Github地址:https://github.com/zhihua-wei/Pkadmin)

1、建立合理的目录结构

CI框架的目录结构以及各目录的功能相信大家都已经很了解了,在这里就不在重复的进行介绍了(如果还有不是很明白的可以去看博主的博客专栏)。我们要实现前后端框架功能分离,首先就要建立合理的目录结构,也就是你想将你的前端控制器放在何处、后台控制器放在何处、前端视图放在那个文件夹、后台管理视图放在那个文件夹。

CI框架实现框架前后端分离的方法详解

如上图是Pkadmin后台管理系统的目录结构,我将控制器全部放在框架本身的controllers文件夹中,只添加了不同的前端后台文件夹存放各自的控制器文件,视图也是同样。不做赘述。

2、扩展加载器设置视图路径

① 为了项目有更好的维护性,我把视图路径设置为常量,在App/config/constants.php中进行定义常量:

//定义前台视图路径常量
define('HOME_VIEW_DIR', 'views/Home/');
//定义后台视图路径常量
define('ADMIN_VIEW_DIR', 'views/Pkadmin/');
//版本
define('PKADMIN_VERSION', '1.0.0');

② 扩展加载器

加载器如何扩展如果有博友不会的可以去查看CI框架手册,上面讲的非常清楚。(多说一句:在APP/core文件夹下创建PK_Loader.php文件)

<?php
/**
 * ==========================================
 * Created by Pocket Knife Technology.
 * Author: ZhiHua_W <zhihua_wei@foxmail.com>
 * Date: 2016/11/02 0031
 * Time: 上午 9:19
 * Project: Pkadmin后台管理系统
 * Version: 1.0.0
 * Power: 加载器扩展
 * ==========================================
 */
defined('BASEPATH') OR exit('No direct script access allowed');
class PK_Loader extends CI_Loader {
 /**
  * 设置前台视图路径
  */
 public function set_home_view_dir() {
  $this -> _ci_view_paths = array(APPPATH . HOME_VIEW_DIR => TRUE);
 }
 /**
  * 设置后台视图路径
  */
 public function set_admin_view_dir() {
  $this -> _ci_view_paths = array(APPPATH . ADMIN_VIEW_DIR => TRUE);
 }
}

3、扩展控制器

扩展控制器主要是为了生成前台后台的父控制器方便与进行操作继承(为了方便可以很快明白其原理,代码有所精简)。

<?php
/**
 * ==========================================
 * Created by Pocket Knife Technology.
 * Author: ZhiHua_W <zhihua_wei@foxmail.com>
 * Date: 2016/11/02 0031
 * Time: 上午 9:23
 * Project: Pkadmin后台管理系统
 * Version: 1.0.0
 * Power: 控制器扩展
 * ==========================================
 */
defined('BASEPATH') OR exit('No direct script access allowed');
/**
 * 前台父控制器
 */
class Home_Controller extends CI_Controller {
 public function __construct() {
  parent::__construct();
  $this -> load -> set_home_view_dir();
 }
}
/**
 * 后台父类控制器
 */
class Pkadmin_Controller extends CI_Controller {
 public $data;
 public function __construct() {
  parent::__construct();
  $this -> load -> set_admin_view_dir();
 }
}

4、测试

在Pkadmin控制器文件夹中新建Admin.php(后台首页)控制器文件进行输出测试(代码有所删除精简)。

<?php
/**
 * ==========================================
 * Created by Pocket Knife Technology.
 * Author: ZhiHua_W <zhihua_wei@foxmail.com>
 * Date: 2016/11/05 0015
 * Time: 上午 10:23
 * Project: Pkadmin后台管理系统
 * Version: 1.0.0
 * Power: 后台主页控制器
 * ==========================================
 */
defined('BASEPATH') OR exit('No direct script access allowed');
class Admin extends Pkadmin_Controller {
 public function __construct() {
  parent::__construct();
  $this -> load -> model('login_model', 'admin');
  $this -> load -> library('pagination');
 }
 /**
  * Pkadmin 后台首页action
  */
 public function index() {
  $this -> load -> view('admin.html', $data);
 }
}

后台控制器继承后台父类控制器,前台控制器集成前台父类控制器,同样的在各自视图文件夹中建立相应的视图文件即可是想前后端的完美分离。

希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

PHP 相关文章推荐
用定制的PHP应用程序来获取Web服务器的状态信息
Oct 09 PHP
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
PHP stripos()函数及注意事项的分析
Jun 08 PHP
PHP生成Gif图片验证码
Oct 27 PHP
php+mysql数据库查询实例
Jan 21 PHP
php实现四舍五入的方法小结
Mar 03 PHP
百度工程师讲PHP函数的实现原理及性能分析(二)
May 13 PHP
CodeIgniter使用smtp服务发送html邮件的方法
Jun 10 PHP
Yii实现显示静态页的方法
Apr 25 PHP
PHP实现的自定义数组排序函数与排序类示例
Nov 18 PHP
php + nginx项目中的权限详解
May 23 PHP
open_basedir restriction in effect. 原因与解决方法
Mar 14 PHP
php mysql实现mysql_select_db选择数据库
Dec 30 #PHP
phalcon model在插入或更新时会自动验证非空字段的解决办法
Dec 29 #PHP
微信公众号模板消息群发php代码示例
Dec 29 #PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 #PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
Dec 29 #PHP
PHP实现的XML操作类【XML Library】
Dec 29 #PHP
php常用字符函数实例小结
Dec 29 #PHP
You might like
php图片的二进制转换实现方法
2014/12/15 PHP
屏蔽F1~F12的快捷键的js函数
2010/05/06 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
jQuery实现平滑滚动到指定锚点的方法
2015/03/20 Javascript
JS实现新浪博客左侧的Blog管理菜单效果代码
2015/10/22 Javascript
js表单元素checked、radio被选中的几种方法(详解)
2016/08/22 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
JavaScript中捕获与冒泡详解及实例
2017/02/03 Javascript
js实现鼠标拖动功能
2017/03/20 Javascript
React-router中结合webpack实现按需加载实例
2017/05/25 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
总结js函数相关知识点
2018/02/27 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
js中apply和Math.max()函数的问题及区别介绍
2018/03/27 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
layui点击按钮页面会自动刷新的解决方案
2019/10/25 Javascript
python多线程http下载实现示例
2013/12/30 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python+matplotlib绘制饼图散点图实例代码
2018/01/20 Python
Django使用Jinja2模板引擎的示例代码
2019/08/09 Python
python-Web-flask-视图内容和模板知识点西宁街
2019/08/23 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
标签和贴纸印刷:Lightning Labels
2018/03/22 全球购物
联想台湾官网:Lenovo TW
2018/05/09 全球购物
Shell编程面试题
2012/05/30 面试题
大学生旅游业创业计划书
2014/01/29 职场文书
房屋出售协议书
2014/04/10 职场文书
市场营销计划书
2015/01/17 职场文书
Python测试框架pytest高阶用法全面详解
2022/06/01 Python