2017-01-21 10 views
2

Мне нужно сбрасывать автозагрузчик каждый раз, когда я добавляю новый класс. Я использую psr-4. Я не знаю, зачем мне это нужно. В psr-4 он должен автоматически загружать классы. Где я иду не так?Нужно сбрасывать автозагрузку каждый раз, когда добавляю новый класс

Вот мой composer.json файл

{"autoload": {"psr-4": {"MyDomain\\": "app"}}} 

Вот моя структура каталогов:

enter image description here

Вот код для одного из моих классов:

<?php 

namespace MyDomain\Model; 

class Employee { 

} 
?> 
+0

Какая операционная система? – axiac

+0

Я использую Ubuntu 16.04 –

+0

И он находит и загружает классы после запуска 'composer dump-autoload'? Странно ... Он не должен их находить. Вы случайно запускаете 'composer dump-autoload -o'? – axiac

ответ

3

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, чтобы немного улучшить свою скорость. Просто не забудьте запустить его снова после каждого развертывания (или, что еще лучше, включить команду в сценарий развертывания).

+0

Это сработало и благодарит вас за очень четкий и точный ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^