> 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,讓更多人受惠!請看下一章:怎么走出去。