当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-29 21:24:36 PHP

我的博客原地址http://www.qinblog.net/Articl...前后台根据功能的不同,我们将网站分为前后台。前台用于向用户展示内容,后台用于管理员管理网站内容。同样,在实现网站应用的编码时,我们也需要根据前台和后台的不同功能,对代码进行整理和组织。那么,对于使用CodeIgniter搭建的网站(以3.x版本为例),前后台应该如何划分呢?前后端分离的几种方法如果用过ThinkPHP的朋友,肯定对下图(TP3.2)不陌生。在TP中实现多个应用程序非常简单。框架本身支持应用分组。新建一个应用,只需要在应用中新建一个文件夹,复制相关内容即可,支持公共模型、配置、配置文件优先级。与不支持该功能的CI框架相比,CI为用户解决多应用问题提供了两种方案:1.创建子目录在Model、Controller等文件夹下创建子文件夹。加载相关模型和控制器时,只需要添加子目录,如下2.多应用多入口在application下创建多个应用文件夹,每个文件夹都是一个应用,为每个应用创建一个入口文件,并定义应用路径,如下特点1.如何创建子目录:属于CI应用,共享配置文件,不能单独配置。比如当后台需要开启钩子函数而前台不需要,或者前台和后台需要分别加载自己的模块时,这种构建方式就不是那么友好。2、多应用多入口:前端和后端分为独立的CI应用,可以分别配置,通过各自的入口文件访问。应用程序完全分离,但无法共享模型和自定义库。解决方案的选择无论选择哪种解决方案,都要根据实际需要来选择。你的项目是否需要前后台分开配置?两个团队是否分别开发前后端?etc.以我的博客为例,我选择了第二个选项。那么如何解决方案二不能??共享模型和类库的问题呢?同样的数据,难道我非要写前后两个模型吗?OK,很明显CI并没有给我们提供分组共享模型的功能,但是CI的一个特点就是“可扩展”,这就需要你自己动手了。这个框架没有那么丰富,但是小巧灵活。CI的乐趣之一。建立一个多入口的应用建立一个目录,设置入口文件复制两个应用类型的文件,分别为home和admin(前面和后面)设置入口文件的$application_folder变量前面:index.php后台:admin.php现在在两个应用中创建不同的欢迎控制器和视图,分别访问index.php、admin、php访问不同的应用。CI框架扩展1.Loader.php代码分析CI模型、视图、类库的加载都是由核心类Loader.php完成的,代码文件路径为system/core/Loader.php。在Loader.php的大约第80行,有如下代码,它设置了model、helper和library的初始搜索路径/***Listofpathstoloadlibrariesfrom**@vararray*/protected$_ci_library_paths=数组(APPPATH,BASEPATH);/***加载模型的路径列表**@vararray*///模型初始搜索路径数组protected$_ci_model_paths=array(APPPATH);/***加载助手的路径列表**@vararray*/protected$_ci_helper_paths=array(APPPATH,BASEPATH);以模型加载为例,大约在320行,在CI_Loader类的model方法中,读取$_ci_model_paths属性,将初始的(第一个元素优先级最高的模型路径数组)拼接成要加载的模型路径,加载模型。//循环路径数组foreach($this->_ci_model_pathsas$mod_path){//如果路径不存在,继续寻找下一条路径if(!file_exists($mod_path.'models/'.$path.$model.'.php')){继续;}//加载模型文件require_once($mod_path.'models/'.$path.$model.'.php');if(!class_exists($model,FALSE)){thrownewRuntimeException($mod_path."models/".$path.$model.".php存在,但不声明类".$model);}//加载文件后不要继续加载搜索路径中的其他文件//搜索路径中的优先级:最高的在左边;}分析代码后,我们不难看出,只要修改$_ci_model_paths属性的初始值,在搜索路径数组的前面增加一条搜索路径(publicpath),这个可以优先查找和在路径中加载模型。当然这里有个问题,是不是要直接修改Loader.php源码?NOCI提供了核心类的扩展和替换功能。我们只需要将Loader.php复制到home和admin应用中的核心文件夹下,依次修改即可完成核心类的替换。2、共享路径的实现,定义常量要实现共享路径,第一步是在application中添加一个普通的应用,添加model、helper等文件夹Part2,在入口文件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.1503服务不可用。',TRUE,503);echo'您的常用文件夹路径似乎设置不正确。请打开以下文件并更正:'.SELF;退出(3);//EXIT_CONFIG}//将路径定义为常量define('APP_COMMON',$common_path.DIRECTORY_SEPARATOR);打开home和admin应用的core/Loader.php,修改相关路径,注意代码优先级。我的设置是APPPATH、APP_COMMON,这是最优先使用APPPATH下的model和libraries,如果找不到就在APP_COMMON路径下搜索。/***从中加载库的路径列表**@vararray*/protected$_ci_library_paths=array(APPPATH,APP_COMMON,BASEPATH);/***从中加载模型的路径列表**@vararray*/protected$_ci_model_paths=array(APPPATH,APP_COMMON);/***加载助手的路径列表**@vararray*/protected$_ci_helper_paths=array(APPPATH,APP_COMMON,BASEPATH);修改后,在common/model新建一个模型文件,前后台应用可以分别访问。最后一个问题很遗憾,虽然多个应用是分开的,但是配置文件是相互独立的,不可能像tp那样实现多级多优先级的配置设置,因为如果看config中的配置文件,许多配置文件的获取路径是硬编码的,例如在hook类中大约有100行(system/core/Hooks.php)//抓取“hooks”定义文件。如果(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添加一个服务层,只要你愿意。