Нужно сбрасывать автоматическую загрузку каждый раз, когда я добавляю новый класс


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

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

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

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

enter image description here

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

<?php

namespace MyDomain\Model;

class Employee {

}  
?>
Author: Pritam Bohra, 2017-01-21

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

 6
Author: axiac, 2017-01-31 20:27:32