Нужно сбрасывать автоматическую загрузку каждый раз, когда я добавляю новый класс
Мне нужно сбрасывать свой автозагрузчик каждый раз, когда я добавляю новый класс. Я использую psr-4. Я действительно не знаю, зачем мне это нужно. В psr-4 он должен автоматически загружать классы. Где я ошибаюсь?
Вот мой файл composer.json
{"autoload": {"psr-4": {"MyDomain\\": "app"}}}
Вот моя структура каталогов:
Вот код для одного из моих классов:
<?php
namespace MyDomain\Model;
class Employee {
}
?>
1 answers
PSR-4 (а также PSR-0) требует, чтобы класс ClassName
хранился в файле с именем ClassName.php
. Имена чувствительны к регистру, и они должны точно совпадать.
Имена файлов в вашем проекте указаны в нижнем регистре, имена классов - в смешанном регистре. Форматы дисков по умолчанию в Windows и macOS не учитывают регистр при поиске. Это означает, что когда программа ищет Employee.php
и файл employee.php
существует в каталоге, поиск завершается успешно, и ОС возвращает существующий файл, даже если регистр его имени не совпадает с регистром требуемого файла. В операционных системах на базе Linux формат диска по умолчанию чувствителен к регистру, и программа, которая ищет Employee.php
, не может найти employee.php
.
Ваш файл composer.json
объявляет каталог app/
корневым каталогом пространства имен MyDomain
, который соответствует стандарту PSR-4
. Этого достаточно, чтобы загрузчик нашел файл app/Models/Employee.php
, когда ему нужно загрузить класс MyDomain\Models\Employee
.
Поскольку вы запускаете его на Ubuntu (которая является операционной системой на базе Linux), PHP не удается загрузить файл Employee.php
(потому что он не существует), и ОС не предоставляет ему файл employee.php
вместо этого.
Похоже, что вы создаете автозагрузчик, используя composer update -o
или composer dump-autoload -o
. -o
(за исключением --classmap-authoritative
) указывает композитору сканировать каталоги, объявленные в composer.json
(app/
) в вашем случае и создайте карту классов, содержащую все классы, которые она может найти. Карта классов - это список, который сопоставляет имена классов (с пространством имен) с именами файлов (с каталогами). Таким образом, загрузчик точно знает где найти каждый класс, и загрузка идет быстрее.
В двух приведенных выше абзацах объясняется, почему вам необходимо повторно создать загрузчик после добавления нового класса.
Правильный способ выполнить эту работу - следовать PSR-4
требования. Чтобы быть более конкретным, каждое пространство имен в разделе MyDomain
должно храниться в подкаталоге app/
с тем же именем, включая регистр. Каждый класс должен храниться в правильном подкаталоге, в файле с тем же именем, что и у класса (включая регистр) и окончание .php
(в нижнем регистре). Например, класс MyDomain\Models\Employee
должен оставаться в файле app/Models/Employee.php
.
После исправления имен файлов вы можете запустить composer dump-autoload
и забыть об этом. Пока имена классов и файлов следуют за PSR-4, загрузчик будет находить их без повторного создания.
На рабочем сервере вы можете запустить composer dump-autoload -o
, чтобы немного повысить его скорость. Просто не забывайте запускать его снова после каждого развертывания (или, что еще лучше, включайте команду в сценарий развертывания).