本文假设读者有能力正常使用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,此博文不会跟随项目文档进行更新