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![](data:image/png;base64,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)
我们先将代码提交到GitHub(注意将vendor目录添加到.gitignore)仓库(我的是nonfu/urlscanner):
创建自己的git仓库:https://github.com/hyzgtihub/urlscanner.git
涉及到的git命令如下:
1
git init
2
git remote add origin https://github.com/hyzgtihub/urlscanner.git
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();