config class 初步實作

這個 config class 參考 kohana 的 config 方式來實作, 搭配先前提到的用 yaml 來作設定檔, 來讀取 yaml 。

首先說明一下, 在 CodeIgniter 讀取設定檔的部份, CI 在讀取設定檔時, 必須先用下面這個方式來載入

$this->load->config('foo'); // 讀取 foo.php 設定檔

當整個設定檔載入之後, 另外在用下面這個指令來取得需要的設定值

$this->config->item('bar'); // 讀取 foo.php 裡的 $config['bar'] 設定值
config_item('bar'); // 或是這樣```

然而看過 kohana 2.1 的做法之後 ( kohana 2.2 把 config 移到 Core 裡, 變成一個 method ), 是覺得 kohana 的做法比較好看 XD 像是下面這樣:

config::item('foo.bar'); // 讀取 foo.php 裡的 $config['bar']
kohana::config('foo.bar'); // kohana 2.2 變成這樣```

另外一個原因就是, 因為 CI 的設定檔都是把所有的 config 載入到同一個 container, 會造成變數名稱衝突, 所以依照 CI Config 的 convention, 就是要在每個設定值的 key 都加上 prefix, 太累贅。 而 kohana 直接用設定檔的名稱當作 prefix, 我覺得是一個不錯的方法。

所以就參考了 kohana 語法的部份, 加上先前寫好的 yaml wrapper 來實作一下, 用來讀取設定檔的 config class, 初步簡單寫了下面這一段。

class Config  
{
    protected static $config = array();
    protected static $segments;

    protected static function load($name)
    {
        $path = APPPATH . 'configs/';

        // if yaml is already loaded, skip load yaml again
        if (array_key_exists($name, self::$config))
            return;

        // load yaml file
        $file = $path . $name . '.yaml';

        if (!file_exists($file))
            die('config file does not exist');

        self::$config[$name] = yaml::load($file);
    }

    public static function item($value)
    {
        self::$segments = split('.', $value);

        $name = array_shift(self::$segments);
        self::load($name);

        $item = self::$config[$name];

        foreach (self::$segments as $segment) {
            $item = $item[$segment];
        }

        return $item;
    }
}

接著, 用下面這個 yaml 檔案來舉個例子:

database.yaml

```

default:
hostname: localhost username: foo password: bar database: testdb dbdriver: mysql dbprefix: pconnect: true dbdebug: true cacheon: false cachedir: charset: utf8 dbcollat: utf8general_ci```

有了這個 config class 就可以用下面的方式來讀取設定檔:

config::item('database.default.hostname'); // 取得 hostname = 'localhost'

不過這個 config class 還是很陽春, 之後一邊寫其他會用到 config 的 library , 再慢慢來修。

hmm… 突然覺得我應該先來看看 seterrorhandler 怎麼弄。

tzangms

Read more posts by this author.

Subscribe to Oceanic / 海海人生

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!