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一些服务器端特性的配置加强php的安全
Oct 09 PHP
PHP 中的批处理的实现
Jun 14 PHP
php下获取客户端ip地址的函数
Mar 15 PHP
PHP5权威编程阅读学习笔记 附电子书下载
Jul 05 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
浅谈php命令行用法
Feb 04 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
PHP-CGI远程代码执行漏洞分析与防范
May 07 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP的RSA加密解密方法以及开发接口使用
Feb 11 PHP
使用php的mail()函数实现发送邮件功能
Jun 03 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函数之子字符串替换&amp;#65279; str_replace
2011/03/23 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
2016/12/02 PHP
PHP实现的基于单向链表解决约瑟夫环问题示例
2017/09/30 PHP
动态加载js的几种方法
2006/10/23 Javascript
js下获取div中的数据的原理分析
2010/04/07 Javascript
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jQuery弹出(alert)select选择的值
2013/04/21 Javascript
setTimeout和setInterval的深入理解
2013/11/08 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
js实现随机抽选效果、随机抽选红色球效果
2017/01/13 Javascript
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
微信小程序事件 bindtap bindinput代码实例
2019/08/26 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
python实现百度关键词排名查询
2014/03/30 Python
Python写的贪吃蛇游戏例子
2014/06/16 Python
python数据清洗系列之字符串处理详解
2017/02/12 Python
python使用fcntl模块实现程序加锁功能示例
2017/06/23 Python
centos6.4下python3.6.1安装教程
2017/07/21 Python
Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法
2018/02/03 Python
浅谈python中对于json写入txt文件的编码问题
2018/06/07 Python
详解Python3中ceil()函数用法
2019/02/19 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
瑞典轮胎在线:Tirendo.se
2018/06/21 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
今冬明春火灾防控工作方案
2014/05/29 职场文书
单位一把手群众路线四风问题整改措施
2014/09/25 职场文书
大学毕业生自我评价
2015/03/02 职场文书
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android