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 сканировать каталоги, объявленные в composer.json
(app/
), в вашем случае и создать карту классов, которая содержит все классы, которые она может найти. Карта классов - это список, который сопоставляет именам классов (с пространством имен) именам файлов (с каталогами). Таким образом, автозагрузчик точно знает, где найти каждый класс, и загрузка идет быстрее.
В приведенных выше двух параграфах объясняется, почему вам необходимо восстановить автозагрузчик после добавления нового класса.
Правильный способ выполнения работы - следовать требованиям PSR-4
. Чтобы быть более конкретным, каждое пространство имен под MyDomain
должно храниться в подкаталоге app/
, который имеет то же имя, включая корпус. Каждый класс должен быть сохранен в правильном подкаталоге, в файле с таким же именем, как класс (включая случай), и завершением .php
(в нижнем регистре). Например, класс MyDomain\Models\Employee
должен оставаться в файле app/Models/Employee.php
.
После того, как вы исправите имена файлов, вы можете запустить composer dump-autoload
и забыть об этом. Пока имена классов и файлов следуют за PSR-4, автозагрузчик найдет их без повторной регенерации.
На рабочем сервере вы можете запустить composer dump-autoload -o
, чтобы немного улучшить свою скорость. Просто не забудьте запустить его снова после каждого развертывания (или, что еще лучше, включить команду в сценарий развертывания).
Какая операционная система? – axiac
Я использую Ubuntu 16.04 –
И он находит и загружает классы после запуска 'composer dump-autoload'? Странно ... Он не должен их находить. Вы случайно запускаете 'composer dump-autoload -o'? – axiac