使用Guzzle的新作曲家包 - 找不到它

时间:2015-11-26 18:15:50

标签: php composer-php guzzle guzzle6

我正在学习如何制作作曲家包。到目前为止,我已经做到了这一点:

composer.json

{
  "name": "Iv/MyPackage",
  "autoload": {
    "psr-4": {
      "Iv\\MyPackage\\": "src/"
    }
  },
  "require": {
    "guzzlehttp/guzzle": "~6.0"
  },
  "require-dev": {
    "phpunit/phpunit": "4.*",
    "guzzlehttp/guzzle": "~6.0"
  },
  "autoload-dev": {
    "psr-4": {
      "Iv\\MyPackage\\Tests\\": "tests/"
    }
  }
}

我在命名空间下面有一个类:namespace Iv\MyPackage\Api;名为Consumer,在__construct方法中它有:

public function __construct(array $credentials)
{
    $this->client = new Client();
    $this->credentials = $credentials;
}

在该课程的顶部,我有use GuzzleHttp\Client;

我得到的错误是: 当我这样做时Fatal error: Class 'GuzzleHttp\Client' not found in path\to\package\Iv\MyPackage\src\Api\Consumer.php on line 27

$package = new Iv\MyPackage\Api\Consumer(['user', 'password']);
$query = $api->prepare('/api-endpoint', 'GET');

修改

这就是我的Consumer课程的样子:

<?php

namespace Iv\MyPackage\Api;


use GuzzleHttp\Client;
class Consumer
{
    private $credentials = [];

    public function __construct(array $credentials)
    {
        $this->client = new Client();
        $this->credentials = $credentials;
    }
    ...
}

我也使用PhpStorm,它告诉我我有GuzzleHttp包,因为当我输入Client()并按 ALT 时它会自动为我输入+ ENTER 。这意味着我已经运行了composer install/update

编辑2 : 我有一个文件 - index.php,其中包含以下内容:

<?php
include('vendor/autoload.php');

$api = new Iv\MyPackage\Api\Consumer(['user', 'password']);

$query = $api->prepare('/endpoint', 'GET');

var_dump($api->execute($query));

文件夹结构如下:

-Iv/
--MyPackage/
---src/
----Api/
----Exceptions/
----vendor/
----tests/
----otherfiles (composer.json, phpunit.xml, etc)
-vendor/
-composer.json
-index.php (I mentioned above)

编辑3 : 我的vendor/composer/autoload_psr4.php

的内容
<?php

// autoload_psr4.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
    'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
    'Iv\\MyPackage\\Tests\\' => array($baseDir . '/tests'),
    'Iv\\MyPackage\\' => array($baseDir . '/src'),
    'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
    'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
    'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
    'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
);

编辑4

index.php的文件夹中,我有这位作曲家:

{
  "name": "Test MyPackage",
  "autoload": {
    "psr-4": {"Iv\\MyPackage\\": "Iv/MyPackage/src"}
  }
}

^^我在SO上看到了一个话题,OP在将其上传到packagist / git之前询问如何测试他的包。我可以加载Consumer类,没有错误,但找不到每个依赖项。 (GuzzleHttp\ClientSymfony\Component\Yaml\Parser等)

2 个答案:

答案 0 :(得分:1)

在主目录的composer.json中,您缺少对包的引用。您只是自动加载它,但您不是自动加载其所有依赖项。

要执行此操作,您必须在主目录的composer.json中添加这样的部分:

"repositories": [
    {
        "url": "path/to/your/package",
        "type": "path"
    }
]

并将其添加到require部分,例如:

"require": {
    "Iv/MyPackage" : "dev-master"
}

或者,您可以将依赖项从包中的composer.json移动到主目录中的

答案 1 :(得分:0)

我认为你几乎把所有东西都搞混了,但它是可以解决的。

我看到你有一个奇怪的目录结构:你的主项目中有Iv/MyPackage/src/...(即在同一级别有一个文件composer.json)。

如果要在主项目中将“Iv / MyPackage”用作Composer包,则必须将其添加为依赖项。这意味着您的包名称必须出现在主"require"文件的composer.json - 部分中。目前它不是。而不是这样,你手动为你的软件包当前所在的路径添加了自动加载 - 没有告诉Composer这应该被视为一个软件包,并且它还有应该下载的依赖项。

您在程序包的目录中添加了程序包的依赖项,但这不是Composer的工作方式。

要修复它,你必须做两件简单的事情:

  1. 将您的包添加为主composer.json中的依赖项。
  2. 如果您的软件包当前托管在私有存储库中,则必须将其网址添加到repositories中的composer.json密钥。
  3. 第一个是这个:

    {
      "name": "Test MyPackage",
      "require": {
        "Iv/MyPackage": "dev-master"
      },
      "autoload": {
      }
    }
    

    删除包的自动加载 - 它已包含在该包中。如果您希望Composer自动加载您的主项目,请在此处添加自动加载(我建议您这样做,因为您可能无法自己编写更好的自动加载器)。

    第二件事是添加存储库:

    {
      "name": "Test MyPackage",
      "repositories": [
        { 
          "type": "vcs", 
          "url": "your repo url, either http or ssh" 
        }
      ],
      "require": {
        "Iv/MyPackage": "dev-master"
      },
      "autoload": {
      }
    }
    

    这告诉Composer查看该存储库并查看它是否可以找到某些内容。找到的所有内容都会添加到已知软件包的集合中(默认源为Packagist),用于选择最佳版本匹配。

    您应该应用一些更正:

    1. 包名称应为小写,因此最好使用iv/mypackage
    2. 如果您在主项目中提供名称,则必须遵循<vendor>/<package>形式,而不是带有名称的随机字符串。 Composer不会拒绝工作,但是一旦到达那里,您将受益于Composer区域中更多可用的基础架构,正确的名称将对您有所帮助。否则,暂时不要离开。
    3. 这应该会启动并运行。我可能会回答你甚至没有问过的更多细节,但建议你在文档页面或Stackoverflow上阅读有关Composer的内容,因为常见的问题通常已经解决了。