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文件內創建次驅動器文件,文件名以主驅動器類名加下划線開頭。
驅動器目錄和文件結構布局如下圖所示:
Usage of drivers in CodeIgniter

創建主驅動器類

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是為了防止名稱與框架沖突,主驅動器類中的publicprotected變量和方法在次驅動器中都是可以訪問的。

創建次驅動器類
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(這篇比較復雜)

 





附件列表

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM