ThinkPHP 簡單強大, 但提供的功能畢竟還是有限的. 好在在開源世界為我們提供了取之不竭的資源, 恰到好處地使用第三方資源, 可以大大降低我們的開發成本, 節約開發時間.
幾乎所有流行的語言, 都有自己的包管理工具, 方便用戶之間自由分享自己的成功, 促進社區的共同繁榮. Python 有pip, Ruby有gem, NodeJs有npm ...
PHP 有 Composer. 通過它, 你可以輕松將其他人已經發布到 packagist.org 的 composer 包集成到自己的項目中. 當安裝了一個composer包之后, 包提供的類和函數在你的項目中都立即可用!
記住: 你越善于使用前人的成果, 你就可以比別人跑的更快, 站得更高, 看的更遠. 人類的科技進步史, 已經證明了這點, 積極擁抱composer, 拒絕等于落后.
* Composer 官網: https://getcomposer.org/
* Packgist 官網: https://packgist.org/
接下來, 我要介紹幾個有用的composer包, 讓我們從問題開始:
## 問題: 環境隔離
真實世界的開發往往是這樣, 多個團隊成員共同開發, 線上線下的代碼通過版本控制系統保持一致.
但你無法保證也沒理由要求所有機器上的應用配置一致. 例如,要求所有成員使用相同的本地數據庫用戶名和密碼是不合理的.
線上線下使用相同的數據庫配置更加不合理.
我們有很多種方式避免這種問題, 一種常見的方法是, 將配置文件重命名為config.example.php, 然后在每個部署的環境再重命名為config.php,并在分發時排除這個文件.
這種方法很容易實現,但缺點是他是靜態的. 每當你增加了一項配置, 或者減少了一項配置, 都需要告訴別人手動處理config.php. 否則, 它的程序可能無法正常運行.
通過專門的環境配置區分不同的部署環境,是另一種被廣泛采用的方案. 它的原理很簡單: 不同的部署環境中, 需要區別的配置往往非常有限, 所有將config.php納入版本控制或者分發包中更合理.
這樣config.php有變化時,其他環境中的應用可以第一時間更新. 那有限的幾個有環境有關配置, 往往都是諸如數據庫配置這種必不可少的. 將它們單獨隔離出來更加合理. 通常, 實施這種方案會把
隔離的配置放在一個名為`.env`的文件中. 因此這種方案, 稱為 **DotEnv**.
Packgist.org 中的 php-dotenv 是一個非常棒的包, 很適合與TP集成. **think-dotenv** 包已經完成了集成, 所以你可以拿來就用:
```
composer require snowair/think-dotenv:dev-master
```
修改 Common/Conf/tags.php
```
return array( 'app_init'=>array( 'Snowair\Think\Behavior\HookAgent' ) )
```
在項目根目錄下創建`.env` 文件, 配置內容以 key=value 的格式逐行書寫,例如:
```
DB_HOST=localhost
DB_NAME=test
DB_USER=root
DB_PWD=root
```
這樣, 應用運行時, 上面四項配置將生效覆蓋config.php中的配置. 不同的部署環境, 只需要創建自己的.env文件, 相互之間就實現了環境隔離.
* GitHub項目地址: https://github.com/snowair/think-dotenv.git
## 問題: 日志管理
開發階段的日志管理很簡單, 甚至很多人認為不重要. 但生產環境中, 如果你輕視日志管理, 代價可能是巨大的. 日志記錄了應用的歷史, 歷史可以詔示未來.
分析海量日志, 你可以得出很多很重要的信息, 這些信息可以幫助你提升性能,避免瓶頸,及時擴容,發現攻擊,修補漏洞....
但TP的日志功能, 非常簡單, 也許無法擔當重任. 試想一下, 當你發展到需要十臺服務器在負載均衡下運行應用時, 你該如何管理你的日志?
或者, 線上代碼出現了隨機偶發性的問題, 本地幾乎不可能重現這些問題,你該如何捕捉信息? 還有很多情況,需要有一個趁手的日志工具幫助你解決問題.
monolog是 Packgist上最流行的日志庫, 在 composer 約7萬余個包中, 它的安裝量排名第一. 它也是symfony和laravel默認集成的日志庫. 它之所以流行, 在于它功能豐富可以滿足各種層次的需要,而且易于集成至其他系統,并且簡單好用.
**think-monolog** 包完成了將monolog集成至TP的工作, 所以在TP項目中, 你只需要這樣使用:
```
composer require snowair/think-monolog:dev-master
```
代碼中:
```
\Snowair\Think\Logger::debug('這是一條debug日志');
```
* GitHub項目地址: https://github.com/snowair/think-monolog.git
### 問題: 單元測試
你的項目越復雜龐大, 可能約需要單元測試. 為獨立的類寫單元測試是件輕松愉快的事情, 但為存在耦合的類寫單元測試就不那么爽快了.
因此, 如果要實施單元測試, 您的代碼需要寫的適合做單元測試. 但有些情景,你可能無能為力: 在TP中, 你的控制器類必須繼承`Think\Controller`類,你的模型類必須繼承`Think\Model`類. 而這兩個類中相當的邏輯, 與TP的生命周期密切耦合.
要測試它們, 你首先需要模擬出應用的執行過程, 創建出它們所需要的那些耦合的元素, 否則它們無法正常執行. 所以, 大多情況, 我們會忽略對這倆種類的測試或只做有限的測算.
**think-phpunit** 的目標是幫助你對控制器和模型類做完整測試, 并且將這一過程簡單化.
首先, 為了讓phpunit能載入你的類, 你必須修改項目的 composer.json:
```
{
"name": "公司名/項目名",
"autoload": {
"classmap": ["Application","ThinkPHP/Library"]
}
}
```
然后安裝:
```
composer require snowair/think-phpunit:dev-master
```
接下來,我創建了一個 `./test/IndexControllerTest.php` 測試類:
```
<?php
class IndexControllerTest extends PhpUnit
{
static public function setupBeforeClass()
{
// 下面四行代碼模擬出一個應用實例, 每一行都很關鍵
parent::$app = new \Think\PhpunitHelper();
parent::$app->setMVC('domain.com','Home','Index');
parent::$app->setTestConfig(['DB_NAME'=>'test', 'DB_HOST'=>'127.0.0.1',]);
parent::$app->start();
}
public function testIndex()
{
$output = $this->execAction('index');
$this->assertEquals('hello world',$output);
}
}
```
然后執行:
```
$ vendor/bin/phpunit test/IndexControllerTest.php
PHPUnit 4.8.6 by Sebastian Bergmann and contributors.
.
Time: 139 ms, Memory: 7.00Mb
OK (1 test, 1 assertion)
```
就是如此輕松.
* GitHub項目地址: https://github.com/snowair/think-phpunit.git
在本節的結束, 再介紹兩個包, 或許您會喜歡:
* twig for TP, GitHub項目地址: https://github.com/snowair/think-twig.git
* whoops for TP, GitHub項目地址: https://github.com/snowair/think-whoops.git
- 序
- 前言
- 內容簡介
- 目錄
- 基礎知識
- 起步
- 控制器
- 模型
- 模板
- 命名空間
- 進階知識
- 路由
- 配置
- 緩存
- 權限
- 擴展
- 國際化
- 安全
- 單元測試
- 拿來主義
- 調試方法
- 調試的步驟
- 調試工具
- 顯示trace信息
- 開啟調試和關閉調試的區別
- netbeans+xdebug
- Socketlog
- PHP常見錯誤
- 小黃鴨調試法,每個程序員都要知道的
- 應用場景
- 第三方登錄
- 圖片處理
- 博客
- SAE
- REST實踐
- Cli
- ajax分頁
- barcode條形碼
- excel
- 發郵件
- 漢字轉全拼和首字母,支持帶聲調
- 中文分詞
- 瀏覽器useragent解析
- freelog項目實戰
- 需求分析
- 數據庫設計
- 編碼實踐
- 前端實現
- rest接口
- 文章發布
- 文件上傳
- 視頻播放
- 音樂播放
- 圖片幻燈片展示
- 注冊和登錄
- 個人資料更新
- 第三方登錄的使用
- 后臺
- 微信的開發
- 首頁及個人主頁
- 列表
- 歸檔
- 搜索
- 分頁
- 總結經驗
- 自我提升
- 進行小項目的鍛煉
- 對現有輪子的重構和移植
- 寫技術博客
- 制作視頻教程
- 學習PHP的知識和新特性
- 和同行直接溝通、交流
- 學好英語,走向國際
- 如何參與
- 瀏覽官網和極思維還有看云
- 回答ThinkPHP新手的問題
- 嘗試發現ThinkPHP的bug,告訴官方人員或者push request
- 開發能提高效率的ThinkPHP工具
- 嘗試翻譯官方文檔
- 幫新手入門
- 創造基于ThinkPHP的產品,進行連帶推廣
- 展望未來
- OneThink
- ThinkPHP4
- 附錄