作者tkdmaf (皮皮快跑)
看板PHP
標題[分享] CodeIgniter,共用核心後的取用核心libraries、helper
時間Tue Jan 11 07:43:55 2011
1/13修正內容:
-----------------
內文原本修改index.php的部份予以刪除,無需改index.php
Loader.php修正目部內文以支援linux作業系統的server。
-----------------
CodeIgniter在網路上已經多所介紹過將system核心和application分家的做法。
也就是修改index.php的設定路徑之後,可以讓多個application共用一個system核心。
可是問題來了。
有的時候或許有一些類別或函式我們希望他會是一個核心提供的類別或函式。
而不是每開啟一個新的專案,就得把一些可以重複利用的功能又copy一次到專案資料夾
的application下的libraries或是helper。
或許有人想說反正system下就有libraries和helpers二個資料夾,有需要共用的寫在那
邊就好了。但是說真正,萬不一小心誤刪功能刪到核心檔(雖然用copy回來的就好了),
也不是一個長久之道。
做法上來說,如果能把原本抽離掉的application再給他「復活一下」,然後將核心共
用的libraries和helpers也寫在system/application/libraries和helpers,這樣的分
離方法相對的可以避免一些意外狀況。
目前的做法上對於命名就是為了避免專案的libraries和helpers檔名重複,所以放在
核心中的類別和helpers我是採取用「core_」做為前導詞。(這部份沒設限置,純看
個人喜好了。)
至於具體的做法,其實是將原本system中的libraries/Loader.php拿出來修改。
使用版本:1.7.2(3應該也行)
Loader.php
---------------------------------------------------------------------
function library($library = '', $params = NULL, $object_name = NULL)
{
找到上面這個函式宣告,在函式一進來就直接加上下面的程式碼。
if(!file_exists('./application/libraries/'.$library.'.php')
&& (!file_exists(BASEPATH.'libraries/'.ucwords($library).'.php')
|| !file_exists(BASEPATH.'libraries/'.ucwords($library).'.php'))
){
$CI = &get_instance();
require_once(BASEPATH.'application/libraries/'.$library.'.php');
$CI->$library = new $library;
return;
}
再來找到下面這個函式宣告,並且找到第一個foreach
function helper($helpers = array())
{
if ( ! is_array($helpers))
{
$helpers = array($helpers);
}
foreach ($helpers as $helper)
{
加上以下的程式碼:
if(!file_exists('./application/helpers/'.$helper.'_helper.php')
&& (!file_exists(BASEPATH.'helpers/'.$helper.'_helper.php')
|| !file_exists(BASEPATH.'helpers/'.ucwords($helper)
.'_helper.php'))){
require_once(BASEPATH.'application/helpers/'.$helper.'_helper.php');
continue;
}
完成之後記得「不要」存回system/libraries
而是存放在你要使用的專案檔的application/libraries
在你個人的專案檔有Loader時,會取代掉核心的那一隻。
(也就是說,如果你的專案需要用到核心類別和函式就放Loader.php,沒有就不要放。
目前測試過,在autoload下叫用核心類別也會自動載入。
注意:如果你專案類別和核心類別都共有一個同名類別或helpers時,會以你專案的檔
案為主,所以不會呼叫到核心的。
注意:如果你的專案函式和核心函式有相同的function name時將會導致異常,請避免
這樣的狀況。
忘記講了:
呼叫類別和函式的方法仍然是:$this->load->library()和
$this->load->helpers()
雖然我曾經一度搞出$this->load->library_sys()這種鬼東西。
好在有其他網友的建議之下,就順手改成符合原本做法的方式。
其實會搞出這種東西是老闆莫名奇妙的想法加上底下工程師的期望.............
反正弄出來也覺得不錯用。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.104.130.157
※ 編輯: tkdmaf 來自: 218.167.139.26 (01/11 08:49)
→ liaosankai:/_\所以我才會改用Kohana3 01/11 13:26
→ tkdmaf:問題是我得支援php4的環境。 01/11 14:46
※ 編輯: tkdmaf 來自: 59.117.2.115 (01/13 10:35)
推 amosa:使用Hook pre_system會比較漂亮~ 01/13 17:15