Новый пакет композитора, который использует 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.
Чтобы это исправить, вам нужно сделать две простые вещи:
- Добавьте свой пакет в качестве зависимости в вашей главной
composer.json
, - Если ваш пакет в настоящее время размещен в частном хранилище, вы должны добавить его 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) и используется для выбора лучших версий.
Некоторые исправления, которые вы должны применить:
- Имена пакетов должны быть в нижнем регистре, поэтому лучше использовать
iv/mypackage
, - Если вы даете имя в своем основном проекте, оно должно следовать форме
<vendor>/<package>
, не быть какой-то случайной строкой с именем. Composer не будет отказывать в работе, но как только вы туда доберетесь, вы получите выгоду от большего количества доступной инфраструктуры в области Composer, и правильные имена помогут вам. В противном случае, просто оставьте это на данный момент.
Это должно настроить вас и работает. Я, вероятно, могу ответить на более подробную информацию, которую вы даже не спрашивали, но предлагаю вам прочитать о Composer на странице документации или здесь, в Stackru, потому что типичные проблемы обычно уже решены.