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+oracle 分页类
Oct 09 PHP
PHP 程序员的调试技术小结
Nov 15 PHP
PHP XML操作类DOMDocument
Dec 16 PHP
基于Zend的Config机制的应用分析
May 02 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
php cli配置文件问题分析
Oct 15 PHP
php利用gd库为图片添加水印
Nov 09 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
thinkPHP模板中函数的使用方法示例
Nov 30 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
解决php extension 加载顺序问题
Aug 16 PHP
php连接mysql数据库最简单的实现方法
Sep 24 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
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
客户端静态页面玩分页
2006/06/26 Javascript
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
javascript 精粹笔记
2010/05/09 Javascript
jQuery 1.5最新版本的改进细节分析
2011/01/19 Javascript
Javascript图像处理—为矩阵添加常用方法
2012/12/27 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JavaScript中提前声明变量或函数例子
2014/11/12 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
jQuery插件Flexslider实现图片轮播、图文结合滑动切换效果
2020/04/16 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
Dropzone.js实现文件拖拽上传功能(附源码下载)
2016/11/22 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
从零开始学习Node.js系列教程四:多页面实现的数学运算示例
2017/04/13 Javascript
使用JS和canvas实现gif动图的停止和播放代码
2017/09/01 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
javascript系统时间设置操作示例
2019/06/17 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
基于原生JS封装的Modal对话框插件的示例代码
2020/09/09 Javascript
[08:17]Ti9 现场cosplay
2019/09/10 DOTA
python 不关闭控制台的实现方法
2011/10/23 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
django如何连接已存在数据的数据库
2018/08/14 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
捷克时尚网上商店:OTTO
2018/03/15 全球购物
高级运动鞋:GREATS
2019/07/19 全球购物
学校志愿者活动总结
2014/06/27 职场文书
学生会个人总结范文
2015/02/15 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书