1.配置格式
ThinkPHP框架中所有配置文件的定義格式均採用返回PHP數組的方式,格式爲:
//項目配置文件
return array(
'DEFAULT_MODULE' => 'Index', //默認模塊
'URL_MODEL' => '2', //URL模式
'SESSION_AUTO_START' => true, //是否開啓session
//更多配置參數
//...
);
配置參數不區分大小寫(因爲無論大小寫定義都會轉換成小寫),所以下面的配置等效:
//項目配置文件
return array(
'default_module' => 'Index', //默認模塊
'url_model' => '2', //URL模式
'session_auto_start' => true, //是否開啓session
//更多配置參數
//...
);
但是我們建議保持大寫定義配置參數的規範。
還可以在配置文件中可以使用二維數組來配置更多的信息,例如:
//項目配置文件
return array(
'DEFAULT_MODULE' => 'Index', //默認模塊
'URL_MODEL' => '2', //URL模式
'SESSION_AUTO_START' => true, //是否開啓session
'USER_CONFIG' => array(
'USER_AUTH' => true,
'USER_TYPE' => 2,
),
//更多配置參數
//...
);
需要注意的是,二級參數配置區分大小寫,也就說讀取確保和定義一致。
2.其他配置格式的支持
我們可以在應用入口文件中定義應用的配置文件的後綴,例如:
define('CONF_EXT','.ini');
定義後,應用的配置文件(包括模塊的配置文件)後綴都統一採用.ini。
該配置不會影響框架內部的配置文件加載。
ini格式配置示例:
DEFAULT_MODULE=Index ;默認模塊
URL_MODEL=2 ;URL模式
SESSION_AUTO_START=on ;是否開啓session
xml格式配置示例:
<config>
<default_module>Index</default_module>
<url_model>2</url_model>
<session_auto_start>1</session_auto_start>
</config>
yaml格式配置示例:
default_module:Index #默認模塊
url_model:2 #URL模式
session_auto_start:True #是否開啓session
json格式配置示例:
{
"default_module":"Index",
"url_model":2,
"session_auto_start":True
}
除了yaml/json/xml/ini
格式之外,我們還可以自定義配置格式,定義如下:
define('CONF_EXT','.test'); // 配置自定義配置格式(後綴)
define('CONF_PARSE','parse_test'); // 對應的解析函數
CONF_PARSE定義的解析函數返回值是一個配置數組。
3.配置的加載
在ThinkPHP中,一般來說應用的配置文件是自動加載的,加載的順序是:
慣例配置->應用配置->模式配置->調試配置->狀態配置->模塊配置->擴展配置->動態配置
以上是配置文件的加載順序,因爲後面的配置會覆蓋之前的同名配置(在沒有生效的前提下),所以配置的優先順序從右到左。
●慣例配置
慣例重於配置是系統遵循的一個重要思想,框架內置有一個慣例配置文件(位於ThinkPHP/Conf/convention.php
),按照大多數的使用對常用參數進行了默認配置。所以,對於應用的配置文件,往往只需要配置和慣例配置不同的或者新增的配置參數,如果你完全採用默認配置,甚至可以不需要定義任何配置文件。
●應用配置
應用配置文件也就是調用所有模塊之前都會首先加載的公共配置文件(默認位於Application/Common/Conf/config.php
)。
如果更改了公共模塊的名稱的話,公共配置文件的位置也相應改變
●模式配置
如果使用了普通應用模式之外的應用模式的話,還可以爲應用模式(後面會有描述)單獨定義配置文件,文件命名規範是:
Application/Common/Conf/config_應用模式名稱.php
(僅在運行該模式下面纔會加載)。模式配置文件是可選的
●調試配置
如果開啓調試模式的話,則會自動加載框架的調試配置文件(位於ThinkPHP/Conf/debug.php
)和應用調試配置文件(位於Application/Common/Conf/debug.php
)
●狀態配置
每個應用都可以在不同的情況下設置自己的狀態(或者稱之爲應用場景),並且加載不同的配置文件。
舉個例子,你需要在公司和家裏分別設置不同的數據庫測試環境。那麼可以這樣處理,在公司環境中,我們在入口文件中定義:
define('APP_STATUS','office');
那麼就會自動加載該狀態對應的配置文件(位於Application/Common/Conf/office.php
)。
如果我們回家後,我們修改定義爲:
define('APP_STATUS','home');
那麼就會自動加載該狀態對應的配置文件(位於Application/Common/Conf/home.php
)。
狀態配置文件是可選的
●模塊配置
每個模塊會自動加載自己的配置文件(位於Application/當前模塊名/Conf/config.php
)。
如果使用了普通模式之外的其他應用模式,你還可以爲應用模式單獨定義配置文件,命名規範爲:
Application/當前模塊名/Conf/config_應用模式名稱.php
(僅在運行該模式下面纔會加載)。
模塊還可以支持獨立的狀態配置文件(該功能爲3.2.2版本新增),命名規範爲:
Application/當前模塊名/Conf/應用狀態.php
。
模塊配置文件是可選的
如果你的應用的配置文件比較大,想分成幾個單獨的配置文件或者需要加載額外的配置文件的話,可以考慮採用擴展配置或者動態配置(參考後面的描述)。
●擴展配置
擴展配置可以支持自動加載額外的自定義配置文件,並且配置格式和項目配置一樣。設置擴展配置的方式如下(多個文件用逗號分隔):
// 加載擴展配置文件'LOAD_EXT_CONFIG' => 'user,db',
假設擴展配置文件user.php
和db.php
分別用於用戶配置和數據庫配置,這樣做的好處是哪怕以後關閉調試模式,你修改db配置文件後依然會自動生效。
如果在應用公共設置文件中配置的話,那麼會自動加載應用公共配置目錄下面的配置文件Application/Common/Conf/user.php
和Application/Common/Conf/db.php
。
如果在模塊(假設是Home模塊)的配置文件中配置的話,則會自動加載模塊目錄下面的配置文件
Application/Home/Conf/user.php
和
Application/Home/Conf/db.php
。
默認情況下,擴展配置文件中的設置參數會併入項目配置文件中。也就是默認都是一級配置參數,例如user.php中的配置參數如下:
默認情況下,擴展配置文件中的設置參數會併入項目配置文件中。也就是默認都是一級配置參數,例如user.php中的配置參數如下:
<?php
//用戶配置文件
return array(
'USER_TYPE' => 2, //用戶類型
'USER_AUTH_ID' => 10, //用戶認證ID
'USER_AUTH_TYPE' => 2, //用戶認證模式
);
那麼,最終獲取用戶參數的方式是:
C('USER_AUTH_ID');
如果配置文件改成:
// 加載擴展配置文件'LOAD_EXT_CONFIG' => array('USER'=>'user','DB'=>'db'),
則最終獲取用戶參數的方式改成:
C('USER.USER_AUTH_ID');
●動態配置
之前的方式都是通過預先定義配置文件的方式,而在具體的操作方法裏面,我們仍然可以對某些參數進行動態配置(或者增加新的配置),主要是指那些還沒有被使用的參數。
設置新的值:
C('參數名稱','新的參數值');
例如,我們需要動態改變數據緩存的有效期的話,可以使用
// 動態改變緩存有效期
C('DATA_CACHE_TIME',60);
動態配置賦值僅對當前請求有效,不會對以後的請求造成影響。
動態改變配置參數的方法和讀取配置的方法在使用上面非常接近,都是使用C方法,只是參數的不同。也可以支持二維數組的讀取和設置,使用點語法進行操作,如下:
// 獲取已經設置的參數值
C('USER_CONFIG.USER_TYPE');
//設置新的值
C('USER_CONFIG.USER_TYPE',1);
4.讀取配置
無論何種配置文件,定義了配置文件之後,都統一使用系統提供的C方法(可以藉助Config單詞來幫助記憶)來讀取已有的配置。
獲取已經設置的參數值:C('參數名稱')
例如,
$model = C('URL_MODEL');
可以讀取到系統的調試模式的設置值,同樣,由於配置參數不區分大小寫,因此
$model = C('url_model');
是等效的,但是建議使用大寫方式的規範。
注意:配置參數名稱中不能含有 “.” 和特殊字符,允許字母、數字和下劃線。
如果url_model
尚未存在設置,則返回NULL。
如果是3.2.1版本的話,支持設置默認值,例如:
C('my_config',null,'default_config');
如果my_config尚未設置的話,則返回default_config。
C方法也可以用於讀取二維配置:
//獲取用戶配置中的用戶類型設置C('USER_CONFIG.USER_TYPE');
因爲配置參數是全局有效的,因此C方法可以在任何地方讀取任何配置,即使某個設置參數已經生效過期了。
5.批量配置
C配置方法支持批量配置,例如:
$config = array
(
'WEB_SITE_TITLE'=>'ThinkPHP',
'WEB_SITE_DESCRIPTION'=>'開源PHP框架'
);
C($config);
$config數組中的配置參數會合併到現有的全局配置中。
我們可以通過這種方式讀取數據庫中的配置參數,例如:
// 讀取數據庫中的配置(假設有一個config表用於保存配置參數)
$config = M('Config')->getField('name,value');
// config是一個關聯數組 鍵值就是配置參數 值就是配置值
// 例如: array('config1'=>'val1','config2'=>'val2',...)C($config);
// 合併配置參數到全局配置
合併之後,我們就可以和前面讀取普通配置參數一樣,讀取數據庫中的配置參數了,當然也可以動態改變。
// 讀取合併到全局配置中的數據庫中的配置參數
C('CONFIG1');
// 動態改變配置參數(當前請求有效,不會自動保存到數據庫)
C('CONFIG2','VALUE_NEW');