驅動器“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');
}
public
functionget_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
{
public
functionget_twitts()
{
return
'Мои последние твитты:'
;
}
public
functionget_friends()
{
return
'@vanya, @stepa '
;
}
}
application/libraries/Connect/drivers/Connect_facebook.php
<?php
if(!defined(
'BASEPATH'))
exit
(
'No direct script access allowed');
classConnect_facebookextendsCI_Driver
{
public
functionget_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 {
public
function__construct()
{
parent
::__construct();
$this
->load->driver(
'connect');
}
public
functionfriends()
{
echo
'我社交網絡的朋友: '
;
echo
$this
->connect->get_friends();
//同時從兩個站點獲得
}
public
functiontwitts()
{
echo
$this
->connect->twitter->get_twitts();
// Twitter記錄
}
}
這個例子相當簡單, 但是對於理解CI中驅動器的概念很有參考價值,更復雜的應用可以參考最后一篇文章。
參考文檔:
· Usage of drivers in CodeIgniter
· Codeigniter Drivers Tutorial(這篇比較復雜)
附件列表