Новый пакет композитора, который использует Guzzle - не могу найти его

Я учусь, как сделать пакет композитора. Пока я сделал это:

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\Client, Symfony\Component\Yaml\Parser, так далее)

2 ответа

В composer.json в главном каталоге вам не хватает ссылки на ваш пакет. Вы просто загружаете его, но не загружаете все его зависимости.

Для этого вы должны добавить раздел, как это в вашем composer.json в основном каталоге:

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

и добавить его в require раздел, что-то вроде:

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

Кроме того, вы можете просто переместить свои зависимости из composer.json внутри вашей посылки, чтобы тот в главном каталоге

Я думаю, что вы немного все перепутали, но это решаемо.

Я вижу, что у вас странная структура каталогов: у вас есть Iv/MyPackage/src/... в вашем основном проекте (т.е. на том же уровне есть файл composer.json).

Если вы хотите использовать свой "Iv/MyPackage" в качестве пакета Composer в своем основном проекте, вы должны добавить его в качестве зависимости. Это означает, что имя вашего пакета должно появиться внутри "require"-Раздел в основном composer.json файл. В настоящее время это не так. Вместо этого вы вручную добавили автозагрузку для пути, по которому в данный момент находится ваш пакет - не сообщая Composer, что это следует рассматривать как пакет и что у него есть зависимости, которые также следует загружать.

Вы добавили зависимости вашего пакета в его каталог, но это не то, как работает Composer.

Чтобы это исправить, вам нужно сделать две простые вещи:

  1. Добавьте свой пакет в качестве зависимости в вашей главной composer.json,
  2. Если ваш пакет в настоящее время размещен в частном хранилище, вы должны добавить его URL к repositories ключ в composer.json,

Первый именно такой:

{
  "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, и правильные имена помогут вам. В противном случае, просто оставьте это на данный момент.

Это должно настроить вас и работает. Я, вероятно, могу ответить на более подробную информацию, которую вы даже не спрашивали, но предлагаю вам прочитать о Composer на странице документации или здесь, в Stackru, потому что типичные проблемы обычно уже решены.

Другие вопросы по тегам