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

news/2024/4/27 8:56:23/文章来源:https://blog.csdn.net/weixin_33782386/article/details/89043496
我的博客原文地址 http://www.qinblog.net/Articl...

前台与后台

根据功能的不同,我们将网站分为前台和后台。前台用于展示内容给用户,后台用于管理员管理网站内容。
同样,在网站应用的编码实现时,我们也需要根据前台、后台的功能不同来进行代码的安排和组织。
那么,使用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层,只要你愿意的话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_761633.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬取证券之星网站

周末无聊,找点乐子。。。#coding:utf-8 import requests from bs4 import BeautifulSoup import random import time#抓取所需内容 user_agent ["Mozilla/5.0 (Windows NT 10.0; WOW64)", Mozilla/5.0 (Windows NT 6.3; WOW64),Mozilla/5.0 (Windows NT …

SEO页面标题Title的优化

我在一个月前改过页面标题(Title),随后表现是:百度网页快照4天不更新,Google正常。而我仅仅是改了两个词组而已。在建博初期,修改Title的最频繁的时期,下面卢松松就我经历的修改Title过程给大家…

xshell中如何给文件夹加密_如何创建一个网站并运行在互联网上(一)

因为自己开始学习创建一个网站的时候,在每一步都花费了不少时间在网上搜寻答案,所以这次的步骤从零开始,在没什么基础的情况下学习搭建环境,创建网站。(非企业级)我们需要一些东西:一台电脑&…

webmagic爬取渲染网站

最近突然得知之后的工作有很多数据采集的任务,有朋友推荐webmagic这个项目,就上手玩了下。发现这个爬虫项目还是挺好用,爬取静态网站几乎不用自己写什么代码(当然是小型爬虫了~~|)。好了,废话少说&#xff…

php网站禁止右键,如何在自己网站设置屏蔽右键防复制

很多网站原创的内容会被恶意复制,或者自己有版权的东西不希望被别人转载,可以在自己做网站时可以增加防复制,禁止右键的功能,也可以达到网站文章复制自动加版权信息的功能。方法/步骤在网站的标签里加上一段JS代码,这样…

一个非常强大的静态导航网站nav

什么是发现导航? 一个纯静态、支持SEO、在线编辑的强大导航网站,内置收录多达 800 优质网站。 🍰 内置 800 实用网站。🍰 支持 SEO。🍰 完全纯静态, 提供自动化部署功能。🍰 三叉树分类、结构清晰、分类清晰…

网站在线监控工具Uptime Kuma

如果你有多个服务或者多台服务器(包括群晖或者vps)在运行,就需要一个在线监控工具来协助管理,提高可用性,防止因为服务器、程序错误等原因导致网站无法访问。如果只是自己用问题不大,但是如果是对外提供服务…

境外服务器网站 域名,境内服务器与境外服务器的域名区别

境内服务器与境外服务器的域名区别 内容精选换一换通过本文档,您可以快速了解华为云CDN的基础知识,如果想了解更多详细信息,可以根据扩展阅读的引导来进行阅读。CDN(Content Delivery Network,内容分发网络)是构建在现有互联网基础…

网站存档服务ArchiveBox

今天是老苏居家隔离的第 43 天。 周四除上午,下午各一次抗原外,上午还做了一次核酸;周五上午两个抗原(间隔 4 小时),下午1点还有一次核酸。 现在核酸也不像之前,一栋一栋通知下楼,…

跳转页面而不改变地址_域名301跳转,对SEO有什么影响?

在SEO优化过程中,经常会遇见搭建新站的情况,搭建完毕后,面临的问题则是如何改变域名使之指向到新网站。通常这种情况我们会运用“301跳转”,那么,进行跳转是否会影响到网站优化呢?一、跳转与权重一般来说,…

网站在线监控工具Statping

本文完成于 8 月,特别需要说明的是,Statping 已经有 2年没更新了,介意的话看看就好了。 什么是 Statping ? Statping 是一个易于使用的状态页面,能自动获取应用程序的信息,并呈现具有大量功能的漂亮状态页面…

php怎么变成网站,php网站怎么跳转网页

php怎么跳转网页的三种方法:header()函数header()函数是PHP中进行页面跳转的一种十分简单的方法。header()函数的主要功能是将HTTP协议标头(header)输出到浏览器。header()函数的定义如下:(推荐学习:PHP编程从入门到精通)void header (string…

安卓电子书格式_好学习、求向上 | 转换各类文件格式?一个网站就够了

点击上方 信息化教学创新 订阅本刊小格我想把pdf转成word。小式嗯,Adobe acrobat支持。小格我想把WMA转成mp3。小式嗯,可以用Online Audio Converter试试。小格我想把AVI转成mp4。小式嗯,可以下载一个格式工厂。小格……请输入文字图、文、…

php自动识别pc和手机端并跳转,JS如何实现网站中PC端和手机端自动识别并跳转对应的代码...

1. 代码场景:描述:在项目中,一般我们会使用响应式布局的方式或者借助bootstrap等插件来做响应式的网站。但是根据业务的需求,手机端可能会在功能上精简很多,我们也会写两套代码,分别用来实现PC端和手机端的…

跨境电商自建站后台系统原型rp_Shoptago---跨境电商平台又一个新选择

在去年邀请2000卖家参与内测的跨境电商自建站平台Shoptago,现在用户数已经达到了3850,成绩可谓,我们也能在各大媒体看到Shoptago相关的新功能上线公告,那么在这段时间里,Shoptago究竟差生了什么变化?这个新…

java web实现博客系统_JavaWeb_gy博客网站_系统实现

目录1、com.jiguiyan.blog  启动层2、com.jiguiyan.blog.config  配置层3、com.jiguiyan.blog.controller  控制器层4、com.jiguiyan.blog.domain  实体层5、com.jiguiyan.blog.dto  数据传输层6、com.jiguiyan.blog.enumeration  枚举层7、com.jiguiyan.blog.filt…

网站一直优化不动,是不是被惩罚?

SEO是一个千变万化的工作,你的每一个优化策略,都决定网站不同的走向,在很长一段时期中,我们通常会遇到各种问题,比如:网站一直优化不动。 长期停留在某个阶段,这让SEO人员,显得无所…

linux运维搭建官网,Linux运维学习之LAMP搭建个人博客网站

Linux运维学习之LAMP搭建个人博客网站个人博客、lamp从开始学习Linux,我就知道搭建博客,也很好奇怎么搭建的博客,今天终于学到了这个知识点,网上的很多的教程感觉都是含糊其辞,对于基础稍微有点薄弱的,根本…

学习计算机安全只知识网站,计算机安全教案

计算机安全教案教材分析本节课陕西省九年义务教育九年制初级中学教科八年级(上册)信息技术,第一章《计算机系统》第六节《计算机安全》的内容,本节内容具有较大的现实意义和教育意义。本节是第一章《计算机系统》的最后一节,内容以理论知识形…

网站改成静态页面打不开_营销型网站建设的六大要点

营销型网站建设的六大要点!这是我们行业内必看的一些东西,希望对大家有帮助~~第一点、全站伪静态,SEO设置设置前台能看到的页面全部伪静态的方式。这样随便搜索个手机的型号前几名都是静态或者伪静态的页面。网站的地图。301重定向即是将网络…