Автоматическая загрузка репозитория GitHub с проблемой композитора


Я получил PHP Fatal error: Class 'sendwithus\sendwithus_php\lib\API' not found

Композитор.json:

{
    "repositories": {
        "sendwithus_php": {
            "type": "package",
            "package": {
                "name": "sendwithus/sendwithus_php",
                "version": "1.0.3",
                "source": {
                    "url": "https://github.com/sendwithus/sendwithus_php",
                    "type": "git",
                    "reference": "0dfed56"
                }
            }
        }
    },
    "require": {
        "sendwithus/sendwithus_php": ">=1.0.3"
    }, "autoload": {
        "psr-0": {
            "Foo\\": "src/",
            "sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"  
        }
    }, "minimum-stability" : "dev"
}

Test.php:

use sendwithus\sendwithus_php\lib\API;

require_once 'vendor/autoload.php';

$api = new API('KEY');

Что я делаю не так?

Author: Karl Horky, 2013-10-24

2 answers

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

Сначала я взглянул на библиотеку, которая вам нужна. Он общедоступен на Github, и в нем есть файл composer.json с ошибками.

{
    "name": "sendwithus/api",
    "version": "1.0.3",
    "require": {},
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/sendwithus/sendwithus_php"
        }
    ]
}

Эти сведения немного неверны. Только имя правильно отформатировано.

  • Версии быть не должно. Версии определяются путем пометки кода в git.
  • Если ничего не требуется, этот ключ может быть опущено.
  • Текущий URL-адрес репозитория не должен быть включен в его собственный репозиторий.
  • Упоминание лицензии было бы неплохо - в настоящее время все, кто использует эту библиотеку, должны опасаться нарушения авторских прав.
  • Важная, но отсутствующая информация: Как настроена автоматическая загрузка?

Изучение содержимого этого репозитория быстро показывает, что оно не соответствует PSR-0, поэтому единственной жизнеспособной альтернативой является автоматическая загрузка карты классов - этого достаточно достаточно, потому что в папке lib всего два файла.

Правильным определением автоматической загрузки было бы:

    "autoload": {
        "classmap": ["lib"]
    }

Подробная информация о том, как это сделать, приведена в http://getcomposer.org/doc/04-schema.md#classmap По сути, значение ключа карты классов представляет собой список каталогов относительно корневого каталога репозитория, которые должны быть проиндексированы.

Здесь не нужно упоминать тестовую папку. Используя PHPUnit, эта папка будет проверена на наличие любого файла, содержащего тестовые занятия. Тестовая начальная загрузка должна включать файл vendor/autoload.php, созданный композитором.

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

Итак, теперь мы рассмотрим упомянутый composer.json ОП:

{
    "repositories": {
        "sendwithus_php": {
            "type": "package",
            "package": {
                "name": "sendwithus/sendwithus_php",
                "version": "1.0.3",
                "source": {
                    "url": "https://github.com/sendwithus/sendwithus_php",
                    "type": "git",
                    "reference": "0dfed56"
                }
            }
        }
    },
    "require": {
        "sendwithus/sendwithus_php": ">=1.0.3"
    }, "autoload": {
        "psr-0": {
            "Foo\\": "src/",
            "sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"  
        }
    }, 
    "minimum-stability" : "dev"
}

Ключ "хранилища" может содержать объекты типа "пакет", которые содержать всю необходимую информацию о проекте, который этого не делает или не делает правильно. Как я уже упоминал, автоматическая загрузка нарушена в исходном определении, поэтому ее необходимо исправить здесь:

        "sendwithus_php": {
            "type": "package",
            "package": {
                "name": "sendwithus/api",
                "version": "1.0.3",
                "source": {
                    "url": "https://github.com/sendwithus/sendwithus_php",
                    "type": "git",
                    "reference": "0dfed56"
                },
                "autoload": {
                    "classmap": ["lib"]
                } 
            }
        }

Это позволит правильно ссылаться на этот репозиторий и включить автоматическую загрузку. Обратите внимание, что имя здесь изменено на исходное - это, вероятно, вызовет проблемы, если эта библиотека известна под двумя разными именами (одно определено здесь, а другое в исходном репозитории), но с использованием одного и того же имена пространств имен и классов.

Теперь, когда информация о репозитории исправлена, все остальное работает как обычно в composer.json.

"require": {
    "sendwithus/api": "1.0.3"
}, 
"autoload": {
    "psr-0": {
        "Foo\\": "src/"
    }
}, 
"minimum-stability" : "dev"

Обратите внимание, что автоматическая загрузка, определенная здесь, предназначена только для ЭТОЙ библиотеки или приложения. Не включайте здесь автоматическую загрузку зависимостей!

А затем мы позаботимся о вашем коде:

use sendwithus\sendwithus_php\lib\API;

require_once 'vendor/autoload.php';

$api = new API('KEY');

Пространство имен неверно. Не используйте имя Композитора. Используйте имя из импортируемого кода. Это правильно:

require_once __DIR__ . "../vendor/autoload.php";

use sendwithus\API;

$api = new API("apikey");

Обратите внимание, что вы не можете изменить пространство имен библиотеки с помощью переименования в Composer. Composer загружает только исходные файлы PHP для вас, он не изменяет код внутри файлов.

Мой последний composer.json файл таков:

{
    "repositories": {
        "sendwithus_php": {
            "type": "package",
            "package": {
                "name": "sendwithus/api",
                "version": "1.0.3",
                "source": {
                    "url": "https://github.com/sendwithus/sendwithus_php",
                    "type": "git",
                    "reference": "0dfed56"
                },
                "autoload": {
                    "classmap": ["lib"]
                }
            }
        }
    },
    "require": {
        "sendwithus/api": "1.0.3",
    },
    "autoload": {
        "psr-0": {
            "Foo\\": "src/"
        }
    },
    "minimum-stability": "dev"
}
 6
Author: Sven, 2013-10-24 22:24:02

Если у вас стандартная структура каталогов (как в vendor/sendwithus/sendwithus_php/lib) Вам нужно будет изменить путь, чтобы он был относительно composer.json этого пакета:

"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"  

Становится:

"sendwithus\\": "lib/"  

Взгляните на vendor/composer/autoload_namespaces.php, в котором должен быть указан используемый путь. Обратите внимание, как composer добавит $vendorDir для вас, чтобы вашему пространству имен не нужно было ссылаться на него

Пример из моего проекта:

'Core\\' => array($vendorDir . '/alex-patterson-webdev/core/src'),
 1
Author: AlexP, 2013-10-24 12:42:12