> TP5终于官方支持composer依赖管理工具,学习过Laravel、Yii、Symfony等国际巨星级框架的码友们应该感受过composer带来的快感:只需一个composer require命令,你需要的菜和各种佐料就准备好了!
> 根据我个人的理解,TP5的思想就是专注与生产优质的好大米,你得自己整合各种配料,做出你想要的炒饭或者寿司。
> 我在官方群潜伏多时,看到很多人问官方什么时候支持XXX啊?之类的问题,我只想说,到了TP5的时代,你必须先think,然后才能PHP。手握神器composer,为什么不think一下,怎么通过composer把外面优秀的扩展引进来?
* * * * *
话不多说,现在讲解一下“怎么引进来”:
[TOC]
###编写thinkphp5 composer扩展
已本人的第一道小炒,基于`gregwar/captcha`的验证码扩展为例,写一下我制作TP5扩展的过程:
Github:[tp5-captcha](https://github.com/CantonBolo/tp5-captcha)
在`vendor`目录中建立文件夹`tp5`
打开命令行,切换到刚才建立的`tp5`目录,运行:
```bash
git init captcha
```
系统会建立的captcha的空仓库
在命令行中进入captcha目录,运行:
```bash
composer init
```
> Package name输入:tp5/captcha
> Description可以暂时留空
> Author可以暂时输入n跳过
> Minimum Stability可以跳过
> Package Type可以跳过
> License可以根据自己的要求输入合适的协议名称
> Would you like to define your dependencies (require) interactively [yes]由于我的扩展需要依赖`gregwar/captcha`,所以我输入yes
> Search for a package输入gregwar/captcha,下一步是设置你需要的版本,最新的就可以,直接回车!
> 后面几步暂时可以全部回车执行默认值!
上面的流程执行完后,composer已经为你生成了一个最短小形态的composer.json文件。
```json
{
"name": "tp5/captcha",
"require": {
"gregwar/captcha": "^1.1"
}
}
```
接下来就是定义composer的加载规则,也就是composer.json里的`autoload`段,推荐使用`psr-4`和`files`这两个规则。
> 那么`psr-0`和`classmap`呢?
`psr-0`和`classmap`这两种规则个人建议不要再使用了,我们可以对比一下`psr-0`和`psr-4`的区别:
Composer使用PSR-0风格:
```
vendor/
vendor_name/
package_name/
src/
Vendor_Name/
Package_Name/
ClassName.php # Vendor_Name\Package_Name\ClassName
tests/
Vendor_Name/
Package_Name/
ClassNameTest.php # Vendor_Name\Package_Name\ClassName
```
Composer使用PSR-4风格:
```
vendor/
vendor_name/
package_name/
src/
ClassName.php # Vendor_Name\Package_Name\ClassName
tests/
ClassNameTest.php # Vendor_Name\Package_Name\ClassNameTest
```
通过对比可以发现使用`psr-4`的目录结构更加简明,至于`classmap`,这么杂乱无章的规则就更不要考虑了。psr标准的宗旨是:代码是写给人看的,不是写给机器看的。因此好的PHP项目都遵循psr标准。
在composer package中,类文件通过`psr-4`规则加载,其他的例如配置文件、函数文件、过程文件之类的通过`files`来进行加载。
回到正题,我给项目定的autoload如下:
```json
"autoload": {
"psr-4": {
"tp5\\captcha\\": "src/" //通过tp5\captcha\命名空间加载src目录里的类文件
},
"files": ['file1.php', 'file2.php'] //如果有不包含类的文件,用files加载
}
```
然后建立src/Captcha.php文件,采用100%手打代码工艺:
```php
namespace tp5\captcha;
use Gregwar\Captcha\CaptchaBuilder;
class Captcha extends CaptchaBuilder {
}
```
我没偷懒,真的就是这么短...........................小精悍。
至此,我已经成功地引gregwar/captcha入TP5了。但是还得测试一下。
###测试本地package
把所做的更改全部提交到本地仓库,然后修改项目根目录的composer.json文件,在repositories段中增加:
```json
"tp5/captcha": {
"type": "vcs",
"url": "./vender/tp5/captcha/"
}
```
然后在命令行中运行:
```bash
composer require tp5/captcha
```
composer会从本地仓库中检出tp5/captcha,并自动生成加载文件。
试试在项目中调用一下tp5/captcha中定义的类或者函数:
```php
new \tp5\captcha\Captcha();
```
如果没有报`Fatal error: class not found`的话,恭喜你,这个package已经可以使用了!
如果对package做了修改,可以运行`composer dump-autoload`重新生成自加载文件,确保你的修改都能引入项目里。
###让你的成果走出去
当你的package足够丰满,有能力应付各种客人时,不妨试试把你的package发布到packagist,让更多人受惠!请看下一章:怎么走出去。