本文假設讀者有能力正常使用composerphp
真實世界的開發每每是這樣, 多個團隊成員共同開發, 線上線下的代碼經過版本控制系統保持一致. 但你沒法保證也沒理由要求全部機器上的應用配置一致. 例如,要求全部成員使用相同的本地數據庫用戶名和密碼是不合理的. 線上線下使用相同的數據庫配置更加不合理.html
咱們有不少種方式避免這種問題, 一種常見的方法是, 將配置文件重命名爲config.example.php, 而後在每一個部署的環境再重命名爲config.php,並在分發時排除這個文件. 這種方法很容易實現,但缺點是他是靜態的. 每當你增長了一項配置, 或者減小了一項配置, 都須要告訴別人手動處理config.php. 不然, 它的程序可能沒法正常運行.laravel
經過專門的環境配置區分不一樣的部署環境,是另外一種被普遍採用的方案. 它的原理很簡單: 不一樣的部署環境中, 須要區別的配置每每很是有限, 全部將config.php歸入版本控制或者分發包中更合理. 這樣config.php有變化時,其餘環境中的應用能夠第一時間更新. 那有限的幾個有環境有關配置, 每每都是諸如數據庫配置這種必不可少的. 將它們單獨隔離出來更加合理. 一般, 實施這種方案會把 隔離的配置放在一個名爲.env
的文件中. 所以這種方案, 稱爲 DotEnv.git
Packgist.org 中的 php-dotenv 是一個很是棒的包, 很適合與TP集成. think-dotenv 包已經完成了集成, 因此你能夠拿來就用:github
composer require snowair/think-dotenv:dev-master
修改 Common/Conf/tags.php數據庫
return array( 'app_init'=>array( 'Snowair\Think\Behavior\HookAgent' ) )
在項目根目錄下建立.env
文件, 配置內容以 key=value 的格式逐行書寫,例如:json
DB_HOST=localhost DB_NAME=test DB_USER=root DB_PWD=root
這樣, 應用運行時, 上面四項配置將生效覆蓋config.php中的配置. 不一樣的部署環境, 只須要建立本身的.env文件, 相互之間就實現了環境隔離.服務器
開發階段的日誌管理很簡單, 甚至不少人認爲不重要. 但生產環境中, 若是你輕視日誌管理, 代價多是巨大的. 日誌記錄了應用的歷史, 歷史能夠詔示將來. 分析海量日誌, 你能夠得出不少很重要的信息, 這些信息能夠幫助你提高性能,避免瓶頸,及時擴容,發現攻擊,修補漏洞....app
但TP的日誌功能, 很是簡單, 也許沒法擔當重任. 試想一下, 當你發展到須要十臺服務器在負載均衡下運行應用時, 你該如何管理你的日誌? 或者, 線上代碼出現了隨機偶發性的問題, 本地幾乎不可能重現這些問題,你該如何捕捉信息? 還有不少狀況,須要有一個趁手的日誌工具幫助你解決問題.composer
monolog是 Packgist上最流行的日誌庫, 在 composer 約7萬餘個包中, 它的安裝量排名第一. 它也是symfony和laravel默認集成的日誌庫. 它之因此流行, 在於它功能豐富能夠知足各類層次的須要,並且易於集成至其餘系統,而且簡單好用.
think-monolog 包完成了將monolog集成至TP的工做, 因此在TP項目中, 你只須要這樣使用:
composer require snowair/think-monolog:dev-master
代碼中:
\Snowair\Think\Logger::debug('這是一條debug日誌');
你的項目越複雜龐大, 可能約須要單元測試. 爲獨立的類寫單元測試是件輕鬆愉快的事情, 但爲存在耦合的類寫單元測試就不那麼爽快了.
所以, 若是要實施單元測試, 您的代碼須要寫的適合作單元測試. 但有些情景,你可能無能爲力: 在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)
就是如此輕鬆.
相比ThinkPHP內置的Think模板引擎, Twig引擎擁有更優雅的語法, IDE的對其支持更好. 而且,使用獨立的Twig引擎開發模板有助於將來的移植: 當項目決定遷移至Laravel或Symfony時, 模板能夠原封不動的保留.
composer require snowair/think-twig:dev-master
引擎配置:
/* Twig模板引擎設置 */ 'TMPL_ENGINE_TYPE' => 'Twig', // 設置爲Twig啓用twig引擎 'TMPL_TEMPLATE_SUFFIX' => '.html', // 設置模板後綴, 可自由設置ACTION_NAME之間的分割符
作完上面的配置, twig就生效了
當系統拋出異常, 咱們須要一個工具, 當即在頁面顯示出異常棧的全過程,Whoops是這方面作的最好的工具.
composer require snowair/think-whoops:dev-master
return array( 'app_init'=>array( 'Snowair\Think\Behavior\HookAgent' ), )
就是這麼簡單, whoops當即生效了!
最新文檔見項目的readme,此博文不會跟隨項目文檔進行更新