Почему 'composer dumpautoload -o' исправляет 'класс не найден' ошибка PHP? - PullRequest
1 голос
/ 30 октября 2019

У меня есть проект Laravel 5.8, который зависит от частного пакета.

Когда я запускаю composer install, пакет устанавливается и отображается в папке поставщика.

проектcomposer.json

{
    ...
    "require": {
        "php": ">=7.0",
        "company/api-request": ">=1.0.0"
    }
    ...
}

пакет src / ApiRequest.php

<?php

namespace Company;

class APIRequest
{
    ...
}

пакет composer.json

{
    ...
    "autoload": {
        "psr-4": {
            "Company\\": "src/"
        }
    }
    ...
}

Когда я вызываю пакет

\Company\APIRequest::run();

Я получаю

Message: Class 'Company\APIRequest' not found

Я знаю, что синтаксис PHP правильный, потому что когда я запускаю composer dumpautoload -o, ошибка исчезает, но зачем это нужно?

Я ожидаю composer install или composer update должно быть достаточно;У меня нет проблем с внешними пакетами.

Я что-то здесь упускаю?

1 Ответ

1 голос
/ 30 октября 2019

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

Имя завершающего класса соответствует имени файла, оканчивающемуся на .php. Имя файла ДОЛЖНО совпадать с регистром имени завершающего класса.

Если это так, возможно, composer dumpautoload -o обходит вас, см. это сообщение Reddit :

Причина -o работает, потому что Composer создает гигантский ассоциативный массив, где classname = filename

...