CodeIgniter中驱动器的使用方法

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

笔者看了这三篇英文参考,加上本身的一些理解,对官方文档关于驱动器的这一部分进行了一些补充。html

1.什么是驱动器

驱动器是一种特殊类型的类库,它有一个父类和任意多个子类。子类能够访问父类, 但不能访问兄弟类。在你的控制器中,驱动器为你的类库提供了 一种优雅的语法,从而不用将它们拆成不少离散的类。数组

通常咱们看到父类和子类,咱们会坚决果断的认为他们是继承和派生的关系,可是这里须要注意的是,驱动器中所提到的子类,并非真的继承了父类驱动器,仅仅是其有访问父类驱动器的权限,在其中一篇参考文献中,做者将父类称为主类(master class),将此类称为次类(sub class),我的认为这种叫法比官方的更为精确,因此后面借用这一称谓。关于这个注意事项在后面的例子里读者能够看到。网络

驱动器位于 system/libraries/ 目录,每一个驱动器都有一个独立的目录,目录名和 驱动器父类的类名一致,在该目录下还有一个子目录,命名为 drivers,用于存放全部子类的文件。app

2.如何使用驱动器?

要使用一个驱动器,你能够在控制器中使用下面的方法来进行初始化:框架

$this->load->driver('class_name');ide

class_name 是你想要调用的驱动器类名,例如,你要加载名为 Some_parent 的驱动器, 能够这样:函数

$this->load->driver('some_parent');codeigniter

而后就能够像下面这样调用该类的方法:布局

$this->some_parent->some_method();

而对于那些子类,咱们不用初始化,能够直接经过父类调用了:

$this->some_parent->child_one->some_method();

$this->some_parent->child_two->another_method();

 

举一个实际的例子,假如咱们须要建立一个Connect类来链接各类社交服务,而且从这些平台获取一些数据。直接借用外国网友的例子。

 

实际的代码看起来是这样的:

$this'connect'->load->driver();
$this->connect->facebook->get_friends();
$this->connect->twitter->get_twitts();

这样就把一些分散的功能集中到一个类库中了,并且结构很是清晰。

3.如何建立驱动器


CI
的官方文档中并无详细介绍如何本身写一个驱动器,所以这里是重点。建立驱动器的第一步是建立一个驱动器文件目录结构, 这里咱们建立本身的驱动器,要放在application/libraries目录下。文件夹名和驱动器类名相同,而且首字母大写如Connect,在此文件夹中再建立一个子文件夹,必定要取名为drivers,注意这里文件夹名称是小写字母,在drivers文件内建立次驱动器文件,文件名以主驱动器类名加下划线开头。
驱动器目录和文件结构布局以下图所示:
Usage of drivers in CodeIgniter

建立主驱动器类

application/libraries/Connect/Connect.php

<?php
 
if'BASEPATH' (!defined())
exit'No direct script access allowed'    ();
 
classConnectextendsCI_Driver_Library
{
public$valid_drivers    ;
public$CI    ;
 
function__construct()    
    {
$this        ->CI = &get_instance();
$this'connect'TRUE        ->CI->config->load(, );
$this$this'modules''connect'        ->valid_drivers = ->CI->config->item(, );
 
    }
publicfunctionget_friends()    
    {
return$this$this        ->twitter->get_friends() . ->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是为了防止名称与框架冲突,主驱动器类中的publicprotected变量和方法在次驱动器中都是能够访问的。

建立次驱动器类
application/libraries/Connect/drivers/Connect_twitter.php

<?php
 
if'BASEPATH' (!defined())
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'BASEPATH' (!defined())
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'BASEPATH'exit'No direct script access allowed' ( ! defined()) ();
 
classHomeextendsCI_Controller {
publicfunction__construct()    
    {
parent        ::__construct();
$this'connect'        ->load->driver();
    }
 
publicfunctionfriends()    
    {
echo'我社交网络的朋友: '        ;
echo$this        ->connect->get_friends();
//同时从两个站点得到        
    }
 
publicfunctiontwitts()    
    {
echo$this        ->connect->twitter->get_twitts();
// Twitter记录        
    }
}

这个例子至关简单, 可是对于理解CI中驱动器的概念颇有参考价值,更复杂的应用能够参考最后一篇文章。

 

 

参考文档:

·         Usage of drivers in CodeIgniter

·         Codeigniter Drivers Tutorial(这篇比较复杂)

 





附件列表

相关文章
相关标签/搜索