作者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)
1F:→ liaosankai:/_\所以我才会改用Kohana3 01/11 13:26
2F:→ tkdmaf:问题是我得支援php4的环境。 01/11 14:46
※ 编辑: tkdmaf 来自: 59.117.2.115 (01/13 10:35)
3F:推 amosa:使用Hook pre_system会比较漂亮~ 01/13 17:15