Почему я должен запустить дамп Composer после установки моего пакета?
Я создал простой пакет на packagist для обучения (tommytest/tommytest). Он отлично устанавливается, но я должен запустить "composer dump-autoload -o" сразу после его установки. Перед ручным запуском dump-autoload я получаю следующее:
Неустранимая ошибка: класс "mysqlgridspace\Page" не найден в C:\xampp\htdocs\simple\index.php в строке 5
После ручного запуска dump-autoload все работает нормально. Разве он не должен обрабатывать установку автозагрузки автоматически при установке пакета?
Вот мой composer.json (находится в: simple / vendor / tommytest / tommytest / composer.json)
{
"name": "tommytest/tommytest",
"type": "library",
"description": "Framework agnostic data grid",
"keywords": ["datagrid","data grid"],
"homepage": "https://github.com/escalibore/tommytest",
"license": "MIT",
"authors": [
{
"name": "Tommy Bert",
"email": "tom@tberthold.com",
"homepage": "http://tberthold.com",
"role": "Developer"
}
],
"require": {
"php": ">=5.3.0"
},
"autoload": {
"psr-4": {
"mysqlgridspace\\":"src/"
}
}
}
И мой файл класса (находится в: simple / vendor / tommytest / tommytest / src / Mysqlgridmain.class.php)
<?php
namespace mysqlgridspace;
class Page {
public function __construct()
{
echo "hello, i am a page.<br>";
}
}
class Book {
public function __construct()
{
echo "hello, i am a book.<br>";
}
}
2 ответа
Эти классы не могут быть автоматически загружены с помощью автозагрузчика Composer PSR-4, поскольку он разрешает имя класса mysqlgridspace\Page
в файл с именем Page.php
, который должен существовать в src
- это не так.
Прежде всего, в каждом файле должен быть объявлен только один класс.
У тебя должно быть
src/
Book.php
Page.php
каждый декларирует только один класс.
Тогда ваше автозагрузка PSR-4 должна работать.
Для справки см. http://www.php-fig.org/psr/psr-4/.
Я нашел способ обойти проблему. Я добавил "files": ["src/Mysqlgridmain.class.php"], к деталям автозагрузки в моем composer.json
Так и вышло из:
"autoload": {
"psr-4": {
"mysqlgridspace\\":"src/"
}
чтобы:
"autoload": {
"files": ["src/Mysqlgridmain.class.php"],
"psr-4": {
"mysqlgridspace\\":"src/"
}
Я не знаю, почему тег psr-4 этого не делает, но я думаю, что это приемлемый обходной путь.