php私有組件以及創建自己的composer私有組件(packagist+git+composer)


1、私有組件

大多數時候我們使用的都是公開可用的開源組件,但有時候如果公司使用內部開發的PHP組件,而基於許可證和安全方面的問題不能將其開源,就需要使用私有組件。對Composer而言,這是小菜一碟。

Composer可用管理放在需要認證的倉庫中的私有PHP組件,執行composer install或composer update命令時,如果組件的倉庫需要認證憑據,Composer會提醒你需要輸入認證信息,此外,Composer還會詢問是否把倉庫的認證憑據保存在本地的auth.json文件(和composer.json放在同一級)。下面是auth.json的內容示例:

2、創建組件

現在你應該知道怎么查找和使用PHP組件了,下面我們來討論如何創建PHP組件。創建PHP組件是把工作成果分享給PHP社區成員的好方式,PHP社區樂於分享和幫助他人,如果你在應用中使用了開源組件,那么投桃報李,創建有創意的新開源組件是回報社區最好的方式。
注:別重新編寫已經存在的組件,如果是改進現有組件,可以在拉取請求中把改進發送給原本的組件,否則,PHP生態系統將充斥重復的組件。

命名空間

在設置命名空間之前,先要確定廠商名稱和包名,即形如laravel/framework這樣,要確保其全局唯一性,在Packagist中不存在。
每個組件都有自己的命名空間,說到這里,人們常常誤以為組件的命名空間必須與組件的廠商名和包名一致,其實不然,組件使用的命名空間與組件的廠商名和包名無關,廠商名和包名只是為了讓Packagist和Composer識別組件,而組件的命名空間是為了在PHP代碼中使用組件。

文件系統結構

PHP組件的文件系統結構基本上是確定的:
  • src:這個目錄用於存放組件的源代碼
  • tests:存放組件的測試代碼
  • composer.json:Composer配置文件,用於描述組件,聲明組件依賴以及自動加載配置等
  • README.md:這個Markdown文件提供關於組件的相關信息、使用文檔說明、軟件許可證等
  • CONTRIBUTING.md:這個Markdown文件告知別人如何為這個組件做貢獻
  • LICENSE:純文本文件,聲明組件的軟件許可證
  • CHANGELOG.md:Markdown文件,列出組件在每個版本中引入的改動

composer.json

PHP組件中必須包含composer.json文件,而且這個文件的內容必須是有效的JSON,Composer會使用這個文件中的信息查找、安裝和自動加載PHP組件。composer.json文件還包含組件在Packagist目錄中的信息。
我們新建一個組件目錄(~/Packages/laravelacademy/urlscanner),然后在urlscanner目錄下通過如下命令生成composer.json文件:
composer init
然后在終端會讓我們按照提示向導一步步填寫composer.json內容:
最后回車,會生成相應的composer.json文件,我們對該文件作如下修改:
 
 
 
 
我們來仔細研究一下這個文件,看看每個部分究竟是什么意思:
  • name:組件的廠商名和包名,也是Packagist中的組件名
  • description:簡要說明組件
  • keywords:描述屬性的關鍵字
  • homepage:組件網站URL
  • license:PHP組件采用的軟件許可證(更多軟件許可證參考:http://choosealicense.com/
  • authors:作者信息數組
  • support:組件用戶獲取技術支持的方式
  • require:組件自身依賴的組件
  • require-dev:開發這個組件所需的依賴
  • suggest:建議安裝的組件
  • autoload:告訴Composer自動加載器如何自動加載這個組件

READEME.md

通常這個是用戶最先閱讀的文件,對托管在Github和Bitbucket中的組件來說,更是如此。標准的READEME.md文件至少提供以下信息:
  • 組件的名稱和描述
  • 安裝說明
  • 使用說明
  • 測試說明
  • 貢獻方式
  • 支持資源
  • 作者信息
  • 軟件許可證

實現組件

開始之前我們使用如下命令安裝依賴:composer install
該命令會把依賴組件安裝到vendor目錄並生成自動加載器。
現在我們要來實現組件的具體功能了。這一步我們要編寫組成PHP組件的類、接口和Trait,編寫什么類以及編寫多少類完全取決於PHP組件的作用。不過組件中的所有類、接口和Trait都要放到src目錄下。
對這個組件來說我只需要創建一個類Scanner,位於子命名空間Url中,這個子命名空間位於composer.json文件中設定的LaravelAcademy/UrlScanner命名空間下,Scanner類保存在src/Url/Scanner.php文件。Scanner類實現的邏輯和 上一節的URL掃描器示例應用相同,只不過現在我們要把掃描URL的功能封裝在一個PHP類中:
<?php
namespace LaravelAcademy\UrlScanner\Url;
 
use GuzzleHttp\Client;
 
class Scanner
{
protected $urls;
protected $httpClient;
 
public function __construct(array $urls){
$this->urls = $urls;
$this->httpClient = new Client();
}
 
/**
* 獲取訪問指定URL的HTTP狀態碼
*
* @param $url
* @return int
*/
public function getStatusCodeForUrl($url)
{
$httpResponse = $this->httpClient->get($url);
 
return $httpResponse->getStatusCode();
}
 
/**
* 獲取死鏈
*
* @return array
*/
public function getInvalidUrls()
{
$invalidUrls = [];
foreach ($this->urls as $url) {
try {
$statusCode = $this->getStatusCodeForUrl($url);
} catch (\Exception $e){
$statusCode = 500;
}
}
 
if($statusCode >= 400){
array_push($invalidUrls,['url' => $url, 'status' => $statusCode]);
}
 
return $invalidUrls;
}
}

 

 
我們沒有解析並迭代處理一個CSV文件,而是把一個URL數組傳遞給Scanner類的構造函數,因為我們要盡量讓這個掃描URL的類通用。如果直接處理CSV文件就限制了這個組件的用途。我們把獲取URL的來源開放給用戶,讓他們自己從文件、數組亦或是CSV文件中獲取。所以回到上面的composer.json,我們在suggest中聲明了league/csv組件,只是建議安裝,並不是必須安裝。
 

提交到Packagis

我們先將代碼提交到GitHub(注意將vendor目錄添加到.gitignore)倉庫(我的是nonfu/urlscanner):
 
 
 
 
創建自己的git倉庫: https://github.com/hyzgtihub/urlscanner.git
 
涉及到的git命令如下:
1
git init
3
git add .
4
git commit -m “urlscanner"
5
git pull origin master
6
git push origin master
然后在Packagist中通過GitHub賬戶登錄,通過 https://packagist.org/packages/submit提交組件,在輸入框中輸入剛剛提交的GitHub倉庫地址:
check成功后點擊submit即可將組件提交到Packagist:
其中紅色的警告的意思是需要我們通過GitHub Service Hook去GitHub中創建一個鈎子,以后每次更新組件的GitHub倉庫時通知Packagist。

3、使用組件

至此,我們已經成功將自己的組件提交到Packagist,現在任何人都可以使用Composer安裝這個URL掃描器組件,然后在自己的PHP應用中使用。在終端執行如下命令安裝這個組件:
1
composer require yokoohumy/urlscanner dev-master
 
然后在我們的代碼中使用:
vendor('yokoohumy.urlscanner.src.Url.Scanner');
// import('yokoohumy.urlscanner.src.Url.Scanner',VENDOR_PATH,'.php');
//
$urls = [
'http://www.baidu.com',
'http://www.ogjdifj.com',
'http://www.bing.com',
'http://www.jianshu.com',
];
 
$Scanner = new Scanner($urls);
 
$invalidurls = $Scanner->getInvalidUrls();
 
var_dump($invalidurls);
exit();

 

 
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM