## 配置基礎
`ThinkPHP`遵循慣例重于配置的原則,系統會按照下面的順序來加載配置文件(配置的優先順序從右到左)。
>[info]#### 慣例配置->應用配置->模塊配置->動態配置
* **慣例配置**:核心框架內置的配置文件,無需更改。
* **應用配置**:每個應用的全局配置文件(框架安裝后會生成初始的應用配置文件),有部分配置參數僅能在應用配置文件中設置。
* **模塊配置**:每個模塊的配置文件(相同的配置參數會覆蓋應用配置),有部分配置參數模塊配置是無效的,因為已經使用過。
* **動態配置**:主要是指在控制器或者行為中進行(動態)更改配置,該配置方式只在當次請求有效,因為不會保存到配置文件中。
>[info] 和5.0最大的區別是,5.1版本的配置參數全部是二級配置,當沒有指定一級配置名的時候,默認就是以`app`作為一級配置,一級配置名稱通常來說就是所在的配置文件名。
## 配置文件和目錄
為更好的應對模塊化的開發要求,`5.1`的應用配置主要包括**應用配置**目錄和**模塊配置**目錄,結構如下:
~~~
├─config(應用配置目錄)
│ ├─app.php 應用配置
│ ├─cache.php 緩存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 數據庫配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ ├─trace.php Trace配置
│ └─ ... 更多配置文件
│
├─route(路由目錄)
│ ├─route.php 路由定義文件
│ └─ ... 更多路由定義文件
│
├─application (應用目錄)
│ └─module (模塊目錄)
│ └─config(模塊配置目錄)
│ ├─app.php 應用配置
│ ├─cache.php 緩存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 數據庫配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ ├─trace.php Trace配置
│ └─ ... 更多配置文件
│
~~~
>[danger] 一定注意了,5.1沒有`config.php`配置文件,默認配置都在`app.php`配置文件,并且配置參數**區分大小寫**
上面的目錄結構是只是列出系統內置的配置文件,你還可以增加其他的自定義配置文件,配置文件的名稱就是一級配置名。
>[danger] 因為架構設計要求,`5.1`的路由配置文件(確切來說應該是路由定義文件)獨立于配置文件(更多會在路由章節中講述)。
應用和模塊的配置目錄對應關系為:
配置|目錄
---|---
應用配置目錄|config
模塊配置目錄|application/module/config
如果你需要統一管理所有的配置文件,那么可以把模塊目錄下面的`config`目錄移動到應用配置目錄下面改為模塊子目錄的方式,調整后的配置目錄的結構如下:
~~~
├─application(應用目錄)
├─config(配置目錄)
│ ├─module (模塊配置目錄)
│ │ ├─database.php 數據庫配置
│ │ ├─cache 緩存配置
│ │ └─ ...
│ │
│ ├─app.php 應用配置
│ ├─cache.php 緩存配置
│ ├─cookie.php Cookie配置
│ ├─database.php 數據庫配置
│ ├─log.php 日志配置
│ ├─session.php Session配置
│ ├─template.php 模板引擎配置
│ └─trace.php Trace配置
│
├─route(路由配置目錄)
│ ├─route.php 路由定義文件
│ └─ ... 更多路由定義文件
~~~
>[danger] 一旦模塊目錄下面存在`config`目錄,則應用配置目錄下的模塊配置則無效,也不會對兩個目錄的配置進行合并。
這樣一來,配置目錄對應關系變成:
配置|目錄
---|---
應用配置目錄|config
模塊配置目錄|config/module
**每個配置文件中都有詳細的配置參數說明,可以仔細查看。**
## 配置定義
可以直接在相應的應用或模塊配置文件中修改或者增加配置參數,如果你要增加額外的配置文件,直接放入應用或模塊配置目錄即可(文件名小寫)。
>[danger] 除了一級配置外,配置參數名嚴格區分大小寫,建議是使用小寫定義配置參數的規范。
另外涉及到配置參數的定義有效性問題,下列配置參數在模塊配置中定義(包括動態配置)無效,而**必須在應用配置中設置**:
配置參數|描述
---|---
app_debug|應用調試模式(支持環境變量配置)
app_trace|應用trace(支持環境變量配置)
class_suffix|類后綴
default_filter|默認過濾機制
root_namespace|根命名空間
pathinfo_depr|PATH_INFO分隔符
url_route_must|路由強制模式
auto_bind_module|自動綁定模塊
default_lang|默認語言
lang_switch_on|多語言切換
由于架構設計原因,下面的配置只能在環境變量中修改。
配置參數|描述
---|---
app_namespace|應用命名空間
config_ext|配置文件后綴
### 其它配置格式支持
默認的配置文件都是PHP數組方式,如果你需要使用其它格式的配置文件,你可以通過改變`CONFIG_EXT`**環境變量**的方式來更改配置類型。
在應用根目錄的`.env`或者系統環境變量中設置
~~~
CONFIG_EXT=".ini"
~~~
支持的配置類型包括` .ini`、`.xml`、`.json` 、`.yaml`和 `.php` 在內的格式支持,配置后應用配置及模塊配置必須統一使用相同的配置類型。
### 二級配置
配置參數的值同樣支持數組,下面是示例:
~~~
return [
'user' => [
'type' => 1,
'name' => 'thinkphp',
],
'db' => [
'type' => 'mysql',
'user' => 'root',
'password' => '',
],
];
~~~
### 環境變量定義
可以在應用的根目錄下定義一個特殊的`.env`環境變量文件,用于在開發過程中模擬環境變量配置(該文件建議在服務器部署的時候忽略),`.env`文件中的配置參數定義格式采用`ini`方式,例如:
~~~
APP_DEBUG = true
APP_TRACE = true
~~~
>[danger] 如果你的部署環境單獨配置了環境變量( 環境變量的前綴使用`PHP_`),那么請刪除`.env`配置文件,避免沖突。
環境變量配置的參數會全部轉換為大寫,值為 `null`,`no` 和 `false` 等效于 `""`,值為 `yes` 和 `true` 等效于 `"1"`。
注意,環境變量不支持數組參數,如果需要使用數組參數可以,使用下劃線分割定義配置參數名:
~~~
DATABASE_USERNAME = root
DATABASE_PASSWORD = 123456
~~~
獲取環境變量的值使用下面的方式:
~~~
Env::get('database_username');
Env::get('database_password');
~~~
如果使用
~~~
[DATABASE]
USERNAME = root
PASSWORD = 123456
~~~
獲取環境變量的值可以使用下面的方式獲取:
~~~
Env::get('database.username');
Env::get('database.password');
~~~
要使用`Env`類,必須先引入`think\facade\Env`或者`\Env`。
>[danger] 環境變量的獲取不區分大小寫
可以支持默認值,例如:
~~~
// 獲取環境變量 如果不存在則使用默認值root
Env::get('database.username','root');
~~~
可以直接在配置文件中使用環境變量進行本地環境和服務器的自動配置,例如:
~~~
return [
'hostname' => Env::get('hostname','127.0.0.1'),
];
~~~
>[danger] 環境變量中設置的`APP_DEBUG`和`APP_TRACE`參數會自動生效(優先于應用的配置文件),其它參數則必須通過`Env::get`方法才能讀取。
## 配置獲取
要使用`Config`類,首先需要在你的類文件中引入
~~~
use think\facade\Config;
~~~
或者(因為系統做了類庫別名,其實就是調用`think\facade\Config`)
~~~
use Config;
~~~
然后就可以使用下面的方法讀取某個配置參數的值:
~~~
echo Config::get('配置參數1');
~~~
如果你需要讀取某個一級配置的所有配置參數,可以使用
~~~
Config::pull('app');
~~~
或者使用
~~~
Config::get('app.');
~~~
讀取所有的配置參數:
~~~
dump(Config::get());
~~~
判斷是否存在某個設置參數:
~~~
Config::has('配置參數2');
~~~
## 助手函數
系統定義了一個助手函數`config`,以上可以簡化為:
~~~
echo config('配置參數1');
~~~
`5.1`的配置參數全部采用二級配置的方式(默認一級配置為app),所以當你使用`config('name')`的時候其實相當于使用:
~~~
config('app.name')
~~~
支持獲取多級配置參數值,直接使用(必須從一級開始寫)
~~~
config('app.name1.name2')
~~~
獲取某個一級配置的所有參數可以使用
~~~
config('app.');
~~~
讀取所有的配置參數:
~~~
dump(config());
~~~
或者你需要判斷是否存在某個設置參數:
~~~
config('?配置參數2');
~~~
## 動態設置(慎用)
>[danger] `V5.1.18+`版本以上,不再建議使用動態配置,由于容器的特性,可能不會生效。
在控制器或者行為里面可以使用`set`方法或者助手函數動態設置參數(不過需要注意的是,動態設置生效的前提是該參數尚未被使用),格式:
~~~
Config::set('配置文件名.配置參數','配置值');
// 或者使用助手函數
config('配置文件名.配置參數','配置值');
~~~
動態設置的參數,最多支持二級,例如:
~~~
Config::set('app_trace', true);
// 沒有指定配置文件名的話 等效于下面的方式
Config::set('app.app_trace', true);
// 助手函數的方式
config('app_trace', true);
~~~
也可以傳入數組批量設置,并在第二個參數傳入一級配置名,例如:
~~~
Config::set([
'app_trace'=>true,
'show_error_msg'=>true
], 'app');
// 或者使用助手函數
config([
'app_trace'=>true,
'show_error_msg'=>true
],'app');
~~~
## 系統配置文件
下面系統自帶的配置文件列表及其作用(配置文件可能同時存在應用配置文件和模塊配置文件兩個同名文件):
配置文件名|描述
---|---
app.php|應用配置
cache.php|緩存配置
cookie.php|Cookie配置
database.php|數據庫配置
log.php|日志配置
session.php|Session配置
template.php|模板引擎配置
trace.php|頁面Trace配置
paginate.php|分頁配置
具體的配置參數可以直接查看應用`config`目錄下面的相關文件內容。
## 使用`Yaconf`定義(`V5.1.22+`)
從`V5.1.22+`版本開始(并且要求`PHP7+`),可以支持使用`Yaconf`統一定義配置,但不支持動態設置。
`V5.1.23+`版本開始,可以使用`setYaconf`方法指定`Yaconf`使用的獨立配置文件,例如:
~~~
// 建議在應用的公共函數文件中進行設置
think\facade\Config::setYaconf('thinkphp');
~~~
設置后,你只需要在`thinkphp.ini`一個文件進行項目的配置,而無需分開多個文件,避免和其它項目沖突。
同時,你還可以在配置文件中,使用`yaconf`助手函數(用法類似`env`函數)
~~~
return [
'config_name' => yaconf('config_name', 'default_value'),
];
~~~
>[danger] `setYaconf`方法的設置對`yaconf`助手函數依然有效
> 關于`Yaconf`的安裝和配置用法可以[參考這里](http://www.laruence.com/2015/06/12/3051.html)。
- 序言
- 基礎
- 安裝
- 開發規范
- 目錄結構
- 配置
- 架構
- 架構總覽
- 入口文件
- URL訪問
- 模塊設計
- 命名空間
- 容器和依賴注入
- Facade
- 鉤子和行為
- 中間件
- 路由
- 路由定義
- 變量規則
- 路由地址
- 閉包支持
- 路由參數
- 路由緩存
- 跨域請求
- 注解路由
- 路由分組
- MISS路由
- 資源路由
- 快捷路由
- 路由別名
- 路由綁定
- 域名路由
- URL生成
- 控制器
- 控制器定義
- 前置操作
- 跳轉和重定向
- 空操作和空控制器
- 分層控制器
- 資源控制器
- 控制器中間件
- 請求
- 請求對象
- 請求信息
- 輸入變量
- 請求類型
- HTTP頭信息
- 偽靜態
- 參數綁定
- 請求緩存
- 響應
- 響應輸出
- 響應參數
- 重定向
- 文件下載
- 數據庫
- 連接數據庫
- 查詢構造器
- 查詢數據
- 添加數據
- 更新數據
- 刪除數據
- 查詢表達式
- 鏈式操作
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- 聚合查詢
- 時間查詢
- 高級查詢
- 視圖查詢
- JSON字段
- 子查詢
- 原生查詢
- 查詢事件
- 獲取器
- 事務操作
- 監聽SQL
- 存儲過程
- 數據集
- 分布式數據庫
- 模型
- 定義
- 新增
- 更新
- 刪除
- 查詢
- JSON字段
- 獲取器
- 修改器
- 搜索器
- 數據集
- 自動時間戳
- 只讀字段
- 軟刪除
- 類型轉換
- 數據完成
- 查詢范圍
- 模型輸出
- 模型事件
- 模型關聯
- 一對一關聯
- 一對多關聯
- 遠程一對多
- 多對多關聯
- 多態關聯
- 關聯預載入
- 關聯統計
- 關聯輸出
- 視圖
- 視圖渲染
- 視圖賦值
- 視圖過濾
- 模板引擎
- 模板
- 變量輸出
- 使用函數
- 運算符
- 原樣輸出
- 模板注釋
- 模板布局
- 模板繼承
- 包含文件
- 輸出替換
- 標簽庫
- 內置標簽
- 循環標簽
- 比較標簽
- 條件判斷
- 資源文件加載
- 標簽嵌套
- 原生PHP
- 定義標簽
- 標簽擴展
- 錯誤和日志
- 異常處理
- 日志處理
- 調試
- 調試模式
- Trace調試
- 性能調試
- SQL調試
- 變量調試
- 遠程調試
- 驗證
- 驗證器
- 驗證規則
- 錯誤信息
- 驗證場景
- 路由驗證
- 內置規則
- 獨立驗證
- 靜態調用
- 表單令牌
- 雜項
- 緩存
- Session
- Cookie
- 多語言
- 分頁
- 上傳
- 命令行
- 啟動內置服務器
- 查看版本
- 自動生成目錄結構
- 創建類庫文件
- 生成類庫映射文件
- 清除緩存文件
- 生成配置緩存文件
- 生成數據表字段緩存
- 生成路由映射緩存
- 輸出路由定義
- 自定義指令
- 擴展庫
- 驗證碼
- 圖像處理
- Time
- 數據庫遷移工具
- Swoole
- Workerman
- MongoDb
- 單元測試
- 安全和性能
- 安全建議
- 優化建議
- 附錄
- 助手函數
- 升級指導
- 更新日志