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 相关文章推荐
JAVA/JSP学习系列之四
Oct 09 PHP
谈谈PHP语法(5)
Oct 09 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
Aug 26 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php preg_replace替换实例讲解
Nov 04 PHP
Zend Framework实现多服务器共享SESSION数据的方法
Mar 22 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
PHP校验15位和18位身份证号的类封装
Nov 07 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
PHP中isset、empty的用法与区别示例详解
Nov 05 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 编程的 5个良好习惯
2009/02/20 PHP
表格展示无限级分类(PHP版)
2012/08/21 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
2013/05/15 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
2017/10/06 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
2020/05/01 PHP
jquery图片切换实例分析
2015/04/15 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
基于jQuery仿淘宝产品图片放大镜特效
2020/10/19 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
2016/06/07 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
Bootstrap模态框插入视频的实现代码
2017/06/25 Javascript
js图片上传的封装代码
2017/08/01 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
在Python中移动目录结构的方法
2016/01/31 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python常用数据类型之间的转换总结
2019/09/06 Python
python中图像通道分离与合并实例
2020/01/17 Python
python opencv如何实现图片绘制
2020/01/19 Python
Python Socket TCP双端聊天功能实现过程详解
2020/06/15 Python
python matplotlib工具栏源码探析二之添加、删除内置工具项的案例
2021/02/25 Python
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
德国受欢迎的旅游和休闲网站:lastminute.de
2019/09/23 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
为什么要用EJB
2014/04/17 面试题
学校周年庆活动方案
2014/08/22 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
工作散漫检讨书
2014/09/16 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
关于五一放假的通知
2015/08/18 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
Mysql数据库值的添加、修改、删除及清空操作实例
2021/06/20 MySQL
Go 语言下基于Redis分布式锁的实现方式
2021/06/28 Golang