ci框架驅動器

1.驅動器什麼是

驅動器是一種特殊類型的類庫,它有一個父類和任意多個子類。子類能夠訪問父類, 但不能訪問兄弟類。在你的控制器中,驅動器爲你的類庫提供了 一種優雅的語法,從而不用將它們拆成不少離散的類。php

通常咱們看到父類和子類,咱們會堅決果斷的認爲他們是繼承和派生的關係,可是這裏須要注意的是,驅動器中所提到的子類,並非真的繼承了父類驅動器,僅僅是其有訪問父類驅動器的權限,在其中一篇參考文獻中,做者將父類稱爲主類(master class),將此類稱爲次類(sub class),我的認爲這種叫法比官方的更爲精確,因此後面借用這一稱謂。關於這個注意事項在後面的例子裏讀者能夠看到。html

驅動器位於 system/libraries/ 目錄,每一個驅動器都有一個獨立的目錄,目錄名和 驅動器父類的類名一致,在該目錄下還有一個子目錄,命名爲 drivers,用於存放全部子類的文件。數組

2.如何使用驅動器?

要使用一個驅動器,你能夠在控制器中使用下面的方法來進行初始化:網絡

$this->load->driver(‘class_name‘);app

class_name 是你想要調用的驅動器類名,例如,你要加載名爲 Some_parent 的驅動器, 能夠這樣:框架

$this->load->driver(‘some_parent‘);ide

而後就能夠像下面這樣調用該類的方法:函數

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

而對於那些子類,咱們不用初始化,能夠直接經過父類調用了:佈局

$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文件內建立次驅動器文件,文件名以主驅動器類名加下劃線開頭。
驅動器目錄和文件結構佈局以下圖所示:
技術分享

建立主驅動器類

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是爲了防止名稱與框架衝突,主驅動器類中的public和protected變量和方法在次驅動器中都是能夠訪問的。

建立次驅動器類
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()) ();
 
class Home extends CI_Controller {
publicfunction__construct()    
    {
parent        ::__construct();
$this‘connect‘        ->load->driver();
    }
 
public function friends()    
    {
echo‘我社交網絡的朋友: ‘        ;
echo$this        ->connect->get_friends();
//同時從兩個站點得到        
    }
 
public function twitts()    
    {
echo$this        ->connect->twitter->get_twitts();
// Twitter記錄        
    }
}
相關文章
相關標籤/搜索