Почему я должен запустить дамп 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 этого не делает, но я думаю, что это приемлемый обходной путь.

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