CodeIgniter中驱动器的使用方法
驱动器“Drivers”是CodeIgniter框架从2.0版本开始加入的新特性。正如中文版译者所言:

笔者看了这三篇英文参考,加上自己的一些理解,对官方文档关于驱动器的这一部分进行了一些补充。
1.什么是驱动器
驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类可以访问父类, 但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成很多离散的类。
一般我们看到父类和子类,我们会毫不犹豫的认为他们是继承和派生的关系,但是这里需要注意的是,驱动器中所提到的子类,并不是真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,作者将父类称为主类(master class),将此类称为次类(sub class),个人认为这种叫法比官方的更为精确,所以后面借用这一称谓。关于这个注意事项在后面的例子里读者可以看到。
驱动器位于 system/libraries/ 目录,每个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放所有子类的文件。
2.如何使用驱动器?
要使用一个驱动器,你可以在控制器中使用下面的方法来进行初始化:
$this->load->driver('class_name');
class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 可以这样:
$this->load->driver('some_parent');
然后就可以像下面这样调用该类的方法:
$this->some_parent->some_method();
而对于那些子类,我们不用初始化,可以直接通过父类调用了:
$this->some_parent->child_one->some_method();
$this->some_parent->child_two->another_method();
举一个实际的例子,假如我们需要创建一个Connect类来连接各种社交服务,并且从这些平台获取一些数据。直接借用外国网友的例子。
实际的代码看起来是这样的:
$this->load->driver('connect');
$this->connect->facebook->get_friends();
$this->connect->twitter->get_twitts();
这样就把一些分散的功能集中到一个类库中了,而且结构非常清晰。
3.如何创建驱动器
CI的官方文档中并没有详细介绍如何自己写一个驱动器,因此这里是重点。创建驱动器的第一步是创建一个驱动器文件目录结构, 这里我们创建自己的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,并且首字母大写如Connect,在此文件夹中再创建一个子文件夹,一定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内创建次驱动器文件,文件名以主驱动器类名加下划线开头。
驱动器目录和文件结构布局如下图所示:

创建主驱动器类
application/libraries/Connect/Connect.php
<?php
if(!defined('BASEPATH'))
exit('No direct script access allowed');
classConnectextendsCI_Driver_Library
{
public$valid_drivers;
public$CI;
function__construct()
{
$this->CI = &get_instance();
$this->CI->config->load('connect',TRUE);
$this->valid_drivers =$this->CI->config->item('modules','connect');
}
publicfunctionget_friends()
{
return$this->twitter->get_friends() .$this->facebook->get_friends();
}
}
读者应该注意到了主驱动器类继承的是CI_Driver_Library,变量$valid_drivers是必须的,它是用来告诉框架应该加载哪些次驱动器,它是一个包含次驱动器类名称的数组。有两种方法来定义这个变量:
第一种方法是直接在驱动器代码中定义:
将下面的代码替换构造函数的最后一句
$this->Valid_drivers= array('connect_twitter', 'connect_facebook');
第二种方法是通过配置文件:
推荐采用这种方法,维护起来比较方便。创建一个文件application/config/connect.php
<?php
$config['modules'] =array('connect_twitter','connect_facebook');
这个字段取名为modules,你可以自己取一个名称,然后正如上面那个例子那样来调用。
在例子中我们还用$CI变量引用了框架的超级对象,然后加载配置文件,参数TRUE是为了防止名称与框架冲突,主驱动器类中的public和protected变量和方法在次驱动器中都是可以访问的。
创建次驱动器类
application/libraries/Connect/drivers/Connect_twitter.php
<?php
if(!defined('BASEPATH'))
exit('No direct script access allowed');
classConnect_twitterextendsCI_Driver
{
publicfunctionget_twitts()
{
return'Мои последние твитты:';
}
publicfunctionget_friends()
{
return'@vanya, @stepa ';
}
}
application/libraries/Connect/drivers/Connect_facebook.php
<?php
if(!defined('BASEPATH'))
exit('No direct script access allowed');
classConnect_facebookextendsCI_Driver
{
publicfunctionget_friends()
{
return'Ivan, Stepan ';
}
}
这里我们注意到次驱动器并不是继承主驱动器,也没有继承CI_Driver_Library而是CI_Driver。
4.在控制器中使用驱动器
由于所有次驱动器有方法主驱动器的权限,次驱动器仅能通过主驱动器访问,因此次驱动器之间的数据交换要通过主驱动器作为中间桥梁。
. application/controller/home.php
<?phpif( ! defined('BASEPATH'))exit('No direct script access allowed');
classHomeextendsCI_Controller {
publicfunction__construct()
{
parent::__construct();
$this->load->driver('connect');
}
publicfunctionfriends()
{
echo'我社交网络的朋友: ';
echo$this->connect->get_friends();
//同时从两个站点获得
}
publicfunctiontwitts()
{
echo$this->connect->twitter->get_twitts();
// Twitter记录
}
}
这个例子相当简单, 但是对于理解CI中驱动器的概念很有参考价值,更复杂的应用可以参考最后一篇文章。
参考文档:
· Usage of drivers in CodeIgniter
· Codeigniter Drivers Tutorial(这篇比较复杂)
附件列表
CodeIgniter中驱动器的使用方法的更多相关文章
- JavaScript中Math对象的方法介绍
1.比较最值方法 比较最值有两种方法,max() 和 min() 方法. 1.1 max() 方法,比较一组数值中的最大值,返回最大值. var maxnum = Math.max(12,6,43,5 ...
- Android中锁定文件的方法
androidSDK中并没有锁定文件相关的api. 但是android是基于linux操作系统的,linux比较底层,灵活性也更大,为了实现锁定文件的效果,大概有以下几种办法: 用chmod命令修改文 ...
- jQuery中的事件绑定方法
在jQuery中,事件绑定方法大致有四种:bind(),live(), delegate(),和on(). 那么在工作中应该如何选择呢?首先要了解四种方法的区别和各自的特点. 在了解这些之前,首先要知 ...
- Eclipse中自动提示的方法参数都是arg0,arg1的解决方法
Eclipse中自动提示的方法参数都是arg0,arg1,就不能根据参数名来推断参数的含义,非常不方便. 解决方法:Preferences->Java->Installed JREs,发现 ...
- Power BI官方视频(2) Power BI嵌入到应用中的3种方法
今天给大家介绍3种将Power BI嵌入到应用中的方法. 本文原文地址:Power BI官方视频(2) Power BI嵌入到应用中的3种方法 Power BI系列文章地址:微软Power BI技术文 ...
- JQuery中each()的使用方法说明
JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...
- Dedecms去掉URL中a目录的方法
本文实例讲述了Dedecms去掉URL中a目录的方法.分享给大家,供大家参考.具体分析如下: 使用dedecms的朋友可能会发现自己的URL目录生成是会自动带有一个/A/目录了,那么要如何去掉URL中 ...
- 【转】C#中WinForm程序退出方法技巧总结
C#中WinForm程序退出方法技巧总结 一.关闭窗体 在c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.Ex ...
- inux中shell截取字符串方法总结
shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法. ${parameter:-word} ${parameter:=word} ${parameter:?word} ...
随机推荐
- 解读Unity中的CG编写Shader系列一
转自http://www.itnose.net/detail/6095323.html 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函 ...
- ios NSNotificationCenter 收到通知后的执行线程
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Notifications/Articles/Thread ...
- MySQL主从复制数据不一致问题【自增主键】
前言: 今天遇到主从表不一致的情况,很奇怪为什么会出现不一致的情况,因为复制状态一直都是正常的.最后检查出现不一致的数据都是主键,原来是当时初始化数据的时候导致的.现在分析记录下这个问题,避免以后再遇 ...
- codeforces Good Bye 2015 B. New Year and Old Property
题目链接:http://codeforces.com/problemset/problem/611/B 题目意思:就是在 [a, b] 这个范围内(1 ≤ a ≤ b ≤ 10^18)统计出符合二进制 ...
- replace和replaceAll(路径反斜杠问题)
转载自:http://www.cnblogs.com/zhenmingliu/archive/2012/01/13/2321560.html 1)replace的参数是char和CharSequenc ...
- 【leetcode】Course Schedule(middle)☆
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- iOS-消息推送机制的实现
OS消息推送的工作机制可以简单的用下图来概括: Provider是指某个iPhone软件的Push服务器,APNS是Apple Push Notification Service的缩写,是苹果的服务器 ...
- 常用邮箱的服务器(SMTP/POP3)地址和端口总结
163.com: POP3服务器地址:pop.163.com(端口:110) SMTP服务器地址:smtp.163.com(端口:25) 126邮箱: POP3服务器地址:pop.126.com(端口 ...
- CSS命名法
一.Css命名法: 1.驼峰命名法:除第一个单词的首字母小写之外,其余的单词首字母均大写.如:#headBlock(2). 2.帕斯卡命名法:所有单词的首字母均大写.如:#HeadBlock(3). ...
- Android笔记:ninepatch
上边框和左边框绘制的部分就表示当图片需要拉伸时就拉伸黑点标记的区域 下边框和右边框绘制的部分则表示内容会被放置的区域