CI框架网站前后台目录搭建

我的博客原文地址 http://www.qinblog.net/Article/article/5

前台与后台

根据功能的不同,我们将网站分为前台和后台。前台用于展示内容给用户,后台用于管理员管理网站内容。
同样,在网站应用的编码实现时,我们也需要根据前台、后台的功能不同来进行代码的安排和组织。
那么,使用CodeIgniter(以3.x版本为例)搭建的网站,前后台应该怎么划分呢?

分开前后台的几种方式

如果有使用过ThinkPHP的朋友,肯定会熟悉下面这张图(TP3.2)

TP中实现多应用是很简单的,框架本省支持应用分组,创建一个新的应用只需在application中新建一个文件夹复制相关内容即可,而且支持公有模型、配置,且支持配置文件优先级。

比起来CI框架并不支持这样的功能,CI提供了两种方案给用户解决多应用问题:

1、创建子目录

在Model、Controller等文件夹下建立子文件夹,加载相关模型、控制器时只需加上子目录即可,如下

2、多应用多入口

在application下建立多个应用文件夹,每个文件夹下是一个应用,为每个应用创建入口文件,定义application路径,如下

两种方式的特点

1、创建子目录方式: 属于一个CI应用,共享配置文件,无法进行单独的配置设置,比如后台要开钩子功能但是前台不需要,或者前后台需要分别加载各自的模块时,这种搭建方式就不是那么友好了。

2、多应用多入口: 前后台分为单独的CI应用,可以单独进行配置,通过各自的入口文件访问,应用完全分离,但是无法进行模型、自定义类库的共享。

方案的选择

无论选择哪种方案,都要跟着实际需求去选择,你的项目前后台是否需要单独的配置?是否是两个队伍分别开发前后台?等等。

就以我的博客为例,我选择了第2种方案。

那么第2种方案无法共享模型、类库的问题怎么解决呢?同样的数据,难道我要为了前后台写两份模型出来吗?

OK,显然CI并没有给我们提供分组、共享模型的功能,但是CI的特点之一就是“可扩展”,需要你自己动手做一些东西,这个框架没那么丰富,但却小巧、灵活,这也是CI的乐趣之一。

多入口应用搭建

搭建目录、设置入口文件

将application种的文件复制两份,分别为home和admin(前后台)

设置入口文件的 $application_folder 变量

前台: index.php

后台: admin.php

此时在两个应用中创建不同的welcome控制器、视图,分别访问index.php
,admin,php就能分别访问到不同的应用了。

CI框架扩展

1、Loader.php代码分析

CI的model、视图、类库等的加载都是靠核心类Loader.php完成的,代码文路径为system/core/Loader.php。

在Loader.php的80行左右,有如下代码,设置了model、helper、librariy的初始寻找路径

 /**
  * List of paths to load libraries from
  *
  * @var array
  */
 protected $_ci_library_paths = array(APPPATH, BASEPATH);

 /**
  * List of paths to load models from
  *
  * @var array
  */
  // 模型初始寻找路径数组
 protected $_ci_model_paths = array(APPPATH);

 /**
  * List of paths to load helpers from
  *
  * @var array
  */
 protected $_ci_helper_paths = array(APPPATH, BASEPATH);

以model的加载为例,在320行左右,CI_Loader类的model方法中,读取了$_ci_model_paths属性,并依次读取初(第一个元素优先级最高)始的model路径数组,拼接成要加载的model路径,对model进行加载。

// 循环路径数组
foreach ($this->_ci_model_paths as $mod_path)
{
    //如果不存在该路径,继续查找下一个路径
    if ( ! file_exists($mod_path.'models/'.$path.$model.'.php'))
    {
        continue;
    }

    // 加载model文件
    require_once($mod_path.'models/'.$path.$model.'.php');
    if ( ! class_exists($model, FALSE))
    {
        throw new RuntimeException($mod_path."models/".$path.$model.".php exists, but doesn't declare class ".$model);
    }
    // 加载文件后不继续加载其他寻找路径中的文件
    // 寻找路径中的优先级:左边最高
    break;
}

分析代码后我们很容易看到,只要修改$_ci_model_paths 属性的初始值,添加一个寻找路径(公有路径)到寻找路径数组的最前,就能优先在这个路径中寻找、加载模型了。

当然,这里有个问题,要直接修改Loader.php源码吗?

NO

CI提供了核心类扩展、替换功能,我们只需把Loader.php拷贝到home、admin两个应用中的core文件夹中,依次修改即可完成核心类的替换。

2、共享路径的实现,定义常量

要实现共享路径,第一步,在application中添加一个common应用,为model、helper等添加文件夹

第二部,入口文件index.php和admin.php中定义常量,参考CI的常量定义代码来定义

// 公共搜索路径
$common_path = 'application/common/';

if (is_dir($common_path)) {
 // 取得绝对路径
    if (($_temp = realpath($common_path)) !== FALSE) {
        $common_path = $_temp;
    } else {
        $common_path = strtr(rtrim($common_path, '/\\'), '/\\', DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR;
    }
} else {
    header('HTTP/1.1 503 Service Unavailable.', TRUE, 503);
    echo 'Your common folder path does not appear to be set correctly. Please open the following file and correct this: '.SELF;
    exit(3); // EXIT_CONFIG
}
// 定义路径为常量
define('APP_COMMON', $common_path.DIRECTORY_SEPARATOR);

打开home、admin应用的core/Loader.php,修改相关路径
注意代码优先级,我的设置为APPPATH, APP_COMMON,即最优先使用APPPATH下的model、libraries, 如果未找到,在APP_COMMON路径下搜索。

/**
  * List of paths to load libraries from
  *
  * @var array
  */
 protected $_ci_library_paths = array(APPPATH, APP_COMMON, BASEPATH);

 /**
  * List of paths to load models from
  *
  * @var array
  */
 protected $_ci_model_paths = array(APPPATH, APP_COMMON);

 /**
  * List of paths to load helpers from
  *
  * @var array
  */
 protected $_ci_helper_paths = array(APPPATH, APP_COMMON, BASEPATH);

修改完成后,在common/model中新建模型文件,前后台应用就可以分别访问到啦。

最后的问题

比较遗憾的是虽然分开了多个应用,但是配置文件都是互相独立,无法实现TP那样的多层级多优先级配置设置,因为如果你查看config中的配置文件的话,很多配置文件的获取路径都是写死的,例如钩子类(system/core/Hooks.php)中的100行左右

// Grab the "hooks" definition file.
if (file_exists(APPPATH.'config/hooks.php'))
{
    include(APPPATH.'config/hooks.php');
}

if (file_exists(APPPATH.'config/'.ENVIRONMENT.'/hooks.php'))
{
    include(APPPATH.'config/'.ENVIRONMENT.'/hooks.php');
}

相似的有很多配置文件的读取都是只能在APPPATH的config目录下读取,想要重写这个加载方案的话所要做的改动就太得不偿失了,当然这并不是CI的缺点,每个工具都有它的设计理念和使用场合,在实际需求中没有好坏与否,只说适不适用。

而且,对于对 .htaccess 重写支持不好的 nginx 来说,这种方式也不太友好。

当然这并不影响CI框架的好用和高扩展性,你甚至可以修改Loader.php给CI的MVC添加一个service层,只要你愿意的话。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • application:具体项目开发目录; system:CI框架代码; user_guide:用户手册,和实现无...
    依点矫情阅读 1,488评论 0 5
  • [程序运作流程]下图说明了整个系统的数据流程: CodeIgniter 程序流程 index.php 文件作为前端...
    聪少Jeff阅读 729评论 0 4
  • 开发中所涉及的屏幕适配无非2种,控件大小的适配和字体大小的适配。 1. 控件大小的适配 1.1 竖屏下的宏,用来设...
    何以_aaa阅读 2,135评论 0 0