前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Codeigniter中对核心类的扩展

Codeigniter中对核心类的扩展

作者头像
大江小浪
发布2018-07-25 09:50:55
1.9K0
发布2018-07-25 09:50:55
举报
文章被收录于专栏:小狼的世界小狼的世界

Codeigniter框架提供了实现多个应用Application的方法,如参考资料[2]中描述的,这种方法实际上是在网站目录下存在多个入口文件和Application文件夹的方式。这种方式实现有个缺点,加入我做了一个应用放在Application下,同时为这个应用做了一个后台放在Admin文件夹下,实际上Model里的模块是可以共用的,但是使用这种方式却不得不将Model做一份拷贝,当然我们也可以使用软链的方式来避免硬拷贝,但是用起来总是不爽。

所以一般我在开发后台的时候,喜欢在 controller 目录下建立一个单独的后台文件夹,例如 controller/admin/,这样就可以实现Model的共用。Controller中的文件需要一些公共的方法,在Codeigniter中,当我们需要在所有的控制器Controller中添加一些公共方法时,可以考虑对Controller进行扩展。例如用户登录的检查函数,具体的方法我们可以参考[1]中的描述。如果我的前台页面不需要检查登录,后台页面需要检查登录,使用这种方法就会有问题。那么我们能不能定义两个可被继承的Controller呢,例如一个叫做My_Controller一个叫做My_AdminController,很可惜的是不行。

扩展核心类的实现代码,位于System/Core/Codeigniter.php的第214行,代码如下:

代码语言:javascript
复制
   1:  if (file_exists(APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller'.EXT))
   2:  {
   3:        require APPPATH.'core/'.$CFG->config['subclass_prefix'].'Controller'.EXT;
   4:  }
代码语言:css
复制
 .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; }

由此可见,我们无法定义一个MY_Controller给前台调用,一个MY_AdminController给后台调用。

在这里只好使用一种变通的方法,通过url的segment来判断,代码如下:

代码语言:javascript
复制
   1:  class MY_Controller extends CI_Controller {
   2:     function __construct(){
   3:        parent::__construct();
   4:        if( $this->uri->segment(1) === 'admin' ){
   5:                       ...
   6:        }
   7:     }
   8:  }
代码语言:css
复制
 .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt  { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; }

希望在Codeigniter的3.0版本中能够有些改善。

适用的Codeigniter版本:2.0及以上。

参考资料:

1、Extending Codigniter's Controller

2、Manage Applications

3、Codeigniter extends core class

4、Codeigniter uri

5、Codeigniter 3.0

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2012-06-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档