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(这篇比较复杂)

来自为知笔记(Wiz)

附件列表

时间: 2024-10-13 14:38:40

CodeIgniter中驱动器的使用方法的相关文章

schema中的虚拟属性方法

schema中的虚拟属性方法相当于vue中的计算属性,它是通过已定义的schema属性的计算\组合\拼接得到的新的值 var personSchema = new Schema({ name: { first: String, last: String } }); var Person = mongoose.model('Person', personSchema); // create a document var bad = new Person({ name: { first: 'Walt

zabbix2.2.3中乱码的解决方法

当将zabbix2.2.3中的语言改为中文后图形后显示如下 解决方法: 1.查看zabbix的字体文件 [[email protected] ~]# cd /usr/share/zabbix/fonts/[[email protected] fonts]# lsgraphfont.ttf 2.将windows系统中你想用的字体文件复制到linux系统中,然后再将字体文件复制到zabbix字体所在的目录中 [[email protected] ~]# cp STXIHEI.TTF /usr/sha

在.net中序列化读写xml方法的总结

在.net中序列化读写xml方法的总结 阅读目录 开始 最简单的使用XML的方法 类型定义与XML结构的映射 使用 XmlElement 使用 XmlAttribute 使用 InnerText 重命名节点名称 列表和数组的序列化 列表和数组的做为数据成员的序列化 类型继承与反序列化 反序列化的实战演练 反序列化的使用总结 排除不需要序列化的成员 强制指定成员的序列化顺序 自定义序列化行为 序列化去掉XML命名空间及声明头 XML的使用建议 XML是一种很常见的数据保存方式,我经常用它来保存一些

URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)

引言: 在Restful类的服务设计中,经常会碰到需要在URL地址中使用中文作为的参数的情况,这种情况下,一般都需要正确的设置和编码中文字符信息.乱码问题就此产生了,该如何解决呢?且听本文详细道来. 1.  问题的引出 在Restful的服务设计中,查询某些信息的时候,一般的URL地址设计为: get /basic/service? keyword=历史 , 之类的URL地址. 但是,在实际的开发和使用中,确是有乱码情况的发生,在后台的读取keyword信息为乱码,无法正确读取. 2. 乱码是如

jquery中html 与 text方法的区别

jquery中html 与 text方法的区别 24 May 2012/in 网站设计和开发 /by Bruce 接鉵jquery的时间并不长,以前都是用直接用js写的,现在发现在jquery这个框架用起来很方便,不但代码量少了,使用也比较简单,对于浏览器的兼容问题也不用担心,在使用的过程中也会遇到一些疑问,在html标签中附加子标签时所用的方法html()与text()的区别. 通常在用jquery写ajax时,都会用到html()这个方法,而不用text()这个方法,他们之间有什么区别呢?

iOS5中UIViewController的新方法

iOS5中UIViewController的新方法 前言 在苹果的 WWDC2011 大会视频的<Session 101 - What’s New in Cocoa> 和<Session 102 - Implementing UIViewController Containment> 中介绍了苹果在 iOS5 中给 UIViewController 新增加的 5 方法以及一个属性: // 方法addChildViewController: removeFromParentViewC

JavaScript中事件绑定的方法总结

最近收集了一些关于JavaScript绑定事件的方法,汇总了一下,不全面,但是,希望便于以后自己查看. JavaScript中绑定事件的方法主要有三种: 1 在DOM元素中直接绑定 2 JavaScript代码中直接绑定 3 绑定事件监听函数 一.在DOM元素中直接绑定 也就是直接在html标签中通过 onXXX=“” 来绑定.举个例子: <input type="button" value="点我呦" onclick="alert("he

笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用

Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDispatcher 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <filter>     <filter-name>struts2</filter-name>     <filter-class>org.apache.struts2.di

为何使用二次参数拦截器栈,,为何需要在beforeInput() [即prepareInput(),本项目中分装为beforeInput()方法] 方法中获取employee

因为,使用模型驱动,可以将不为空的employee压入栈顶,从而使得页面中以employee的属性名作为name的Struts标签元素能够获取到对应属性名的属性值,在点击修改后,可以实现回显. 具体的: 由于modelDriven拦截器先于input()方法执行,因此需要将获取employee的方法提前到modelDriven拦截器之前,即在prepareInput()方法获取employee,此时employee就不空了,再在后面执行到modelDriven拦截器时就将employee对象放入