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,此博文不会跟随项目文档进行更新

相关文章
相关标签/搜索