ThinkPHP開發必備composer擴展包

本文假設讀者有能力正常使用composerphp

環境隔離 dotenv

真實世界的開發每每是這樣, 多個團隊成員共同開發, 線上線下的代碼經過版本控制系統保持一致. 但你沒法保證也沒理由要求全部機器上的應用配置一致. 例如,要求全部成員使用相同的本地數據庫用戶名和密碼是不合理的. 線上線下使用相同的數據庫配置更加不合理.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文件, 相互之間就實現了環境隔離.服務器

全功能日誌 monolog

開發階段的日誌管理很簡單, 甚至不少人認爲不重要. 但生產環境中, 若是你輕視日誌管理, 代價多是巨大的. 日誌記錄了應用的歷史, 歷史能夠詔示將來. 分析海量日誌, 你能夠得出不少很重要的信息, 這些信息能夠幫助你提高性能,避免瓶頸,及時擴容,發現攻擊,修補漏洞....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日誌');

敏捷利器 phpunit

你的項目越複雜龐大, 可能約須要單元測試. 爲獨立的類寫單元測試是件輕鬆愉快的事情, 但爲存在耦合的類寫單元測試就不那麼爽快了.

所以, 若是要實施單元測試, 您的代碼須要寫的適合作單元測試. 但有些情景,你可能無能爲力: 在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)

就是如此輕鬆.

優雅模板 Twig引擎

相比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

當系統拋出異常, 咱們須要一個工具, 當即在頁面顯示出異常棧的全過程,Whoops是這方面作的最好的工具.

composer require snowair/think-whoops:dev-master
  • 在 Common/Conf/tags.php 增長一個行爲,若是以前已經添加過,就不用再添加了:
    return array(
         'app_init'=>array(
            'Snowair\Think\Behavior\HookAgent'
         ),
    )

就是這麼簡單, whoops當即生效了!

注意

最新文檔見項目的readme,此博文不會跟隨項目文檔進行更新

相關文章
相關標籤/搜索