编写自己的Composer包

简介:你或许使用过多个框架,或许自己开发过很多组件,多个类库,接口等。会不会因为切换框架而头疼,是不是还得修改你的代码,可能还得在某一框架里面重新包含这些文件进来。现在有两个工具可以帮助你解决这一问题,它们分别是Composer和PEAR.我们主要推荐Composer,并使用Composer开发基于psr系列规范化的组件,类库等。可以达到一次编程,随处可用的效果。当然,这是得注意一下PHP版本。下面我们将一一领略使用Composer创建自己的组件,并在Thinphp和Laravel中使用来证明为何说Composer一统PHP天下的时代来临。

要点:

理解composer如何实现自动加载第三方组件; 理解psr-0和psr-4的规范; 理解基于psr-0,psr-4,classmap,files如何实现自动加载。 理解Composer和Packagist

如:要编写一个Api类,该类主要是使用CURL模拟HTTP的GET和POST请求.

1.先创建目录结构:
$ mkdir -p  sexyphp/curl-http-request/src/

 
 

如: sexyphp/curl-http-request/src/

2.创建文件
$touch sexyphp/curl-http-request/src/Api.php 

 
 
3.写入文件内容:

 
 
  1. 格式如:
  2. namespace DIRNAME\...\DIRNAME;
  3. Use DIRNAME\...\DIRNAME\FILENAME;
  4. const CONNECT_OK = 1;
  5. class Connection { /* ... */ }
  6. function connect() { /* ... */ }
  7. 内容:
  8. <?php
  9. namespace Sexyphp\ Src;
  10. use Sexyphp\ Src\ Curl;
  11. class Api
  12. {
  13. private $curl;
  14. private $pathSuffix;
  15. /**
  16. * Api constructor.
  17. */
  18. public function __construct($pathSuffix)
  19. {
  20. $this->curl = new Curl();
  21. $this->pathSuffix = $pathSuffix;
  22. }
  23. public function getData($uri)
  24. {
  25. $out = $this->curl->get( $this->pathSuffix.$uri);
  26. if ( $this->curl->http_code != 200) {
  27. throw new \ Exception( "error: can't connect server");
  28. }
  29. if(is_null(json_decode($out))){
  30. if(env( 'APP_DEBUG')){
  31. var_dump($out);
  32. }
  33. throw new \ Exception( 'error: is not json');
  34. }
  35. $json = $this->str2json($out);
  36. if ( ! isset($json[ "code"])) {
  37. if(env( 'APP_DEBUG')){
  38. echo $out;
  39. }
  40. throw new \ Exception( 'error:not find json[code]');
  41. }
  42. return $out;
  43. }
  44. public function postData($uri, $vars = array())
  45. {
  46. $out = $this->curl->post( $this->pathSuffix.$uri, $vars);
  47. $json = $this->str2json($out);
  48. if ($json[ "code"] == 200) {
  49. return $json[ "data"];
  50. } else {
  51. throw new \ Exception($json[ "msg"]);
  52. }
  53. }
  54. private function str2json($str)
  55. {
  56. return json_decode($str, true);
  57. }
  58. }

还有一个CURL类的代码没贴出来,详情可在GITHUB中查看项目源码:https://github.com/sexyphp/composer/tree/master/vendor/sexyphp 是否跟你所的类库也很相似,这都是得益于PHP5.3之后的命名空间的出现.命名空间不熟悉的话,请先看看官方的介绍:http://php.net/language.namespaces.

4.通过上面的操作,已经完成该了两个类库的开发,那么如何使用Composer来实现依赖关系呢!聪明的你,应该想到了需要创建一个composer.json文件了.

1) composer包的目录结构 你现在可以看看Laravel或者Thinphp包含有vendor目录下面的组件,仔细看看都有什么规律吗?咱们以laravel框架下的vendor/laravel为例,当然其他框架的也可以看看,大致都是一样的规律,这就是统一规范的好处!那就是不让你随便定义组件文件和代码结构,你有你的style,我有我的style,那就叫花式虐狗了.


 
 
  1. example for laravel/ laravel:
  2. laravel
  3. framework
  4. src
  5. ...
  6. ...
  7. dirname../**.[ class].php
  8. composer.json
  9. LICENCE.md
  10. README.md

一个供应商可能还有N个开源工具在同一个包里面,上面是一个常见的结构,还有一种如下:


 
 
  1. example for laravel/ phpunit:
  2. phpunit
  3. php-code-coverage
  4. src
  5. ...
  6. ...
  7. dirname../**.[ class].php
  8. composer.json
  9. LICENCE.md
  10. README.md
  11. php-timer
  12. src
  13. ...
  14. ...
  15. dirname../**.[ class].php
  16. composer.json
  17. LICENCE.md
  18. README.md

其实我个人也只推荐这两种,虽然说基于命名空间你可随处都放,只要自动加载能找到就行.所以标准就是要大家规范化编程,养成良好的撸代码习惯,太骚气的代码容易惹祸上身哦!

2).创建composer.json实现自动加载所需依赖组件,简单的组件json格式如下:


 
 
  1. {
  2. "name": "sexyphp/curl-http-request",
  3. "description": "The Sexyphp curl-http-request.",
  4. "keywords": [ "sexyphp", "curl", "http request"],
  5. "type": "library",
  6. "license": "MIT",
  7. "homepage": "http://sexyphp.com",
  8. "support": {
  9. "issues": "https://github.com/sexyphp/composer/issues",
  10. "source": "https://github.com/sexyphp/composer/tree/master/vendor/sexyphp"
  11. },
  12. "authors": [
  13. {
  14. "name": "LiangFeng",
  15. "email": "1092313007@qq.com"
  16. }
  17. ],
  18. "require": {
  19. "php": "^5.3|^7.0"
  20. },
  21. "replace": {
  22. },
  23. "require-dev": {
  24. },
  25. "autoload": {
  26. "classmap": [
  27. "src/"
  28. ]
  29. },
  30. "extra": {
  31. "branch-alias": {
  32. "dev-master": "1.0-dev"
  33. }
  34. }
  35. }
5.在应用目录外的composer.json加入(只选一种):

 
 
  1. "autoload-dev": {
  2. "classmap": [
  3. "vendor/sexyphp"
  4. ]
  5. },
  6. 或者:
  7. "autoload": {
  8. "classmap": [
  9. "vendor/sexyphp"
  10. ]
  11. },
  12. 或者:
  13. "autoload":{
  14. "psr-4": {
  15. "Sexyphp\\" : "vendor/sexyphp/curl-http-request"
  16. }
  17. },

可根据上一篇博客所说的使用4种加载方式,classmap,psr-0,psr-4,files

6.执行dump-autoload加载
$ composer dump-autoload

 
 
7.如果报错,可能是json文件的格式没对.如果没报错,那就查看vendor/composer/autoload_classmap.php或autoload_static.php是否自动加载了你自己开发的包.

 
 
  1. eg: autoload_classmap.php
  2. 'Sexyphp\\Src\\Api' => $vendorDir . '/sexyphp/curl-http-request/src/Api.php',
  3. 'Sexyphp\\Src\\Curl' => $vendorDir . '/sexyphp/curl-http-request/src/Curl.php',
  4. eg: autoload_static.php
  5. 'Sexyphp\\Src\\Api' => __DIR__ . '/..' . '/sexyphp/curl-http-request/src/Api.php',
  6. 'Sexyphp\\Src\\Curl' => __DIR__ . '/..' . '/sexyphp/curl-http-request/src/Curl.php',
8.在入口目录中调用Api类查看是否正确加载进来了.

 
 
  1. <?php
  2. require "vendor/autoload.php";
  3. $api = new \Sexyphp\Src\Api( 'http://sexyphp.com/');
  4. $data = $api->getData( 'index.php?m=Home&c=Article&a=index&id=4');
  5. var_dump($data);
    $ php index.php查看var_dump输出 或浏览器输入 : localhost查看

本篇就将到这里,下一篇将使用Composer创建抽象接口集成组件式开发.

本篇文章同步项目源码地址:https://github.com/sexyphp/composer

问题:你理解composer如何实现自动加载第三方组件了吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值