Проверьте структуру файла / класса PSR-4 (безболезненная миграция на PSR-4)
У меня есть пакет композитора, который используется во внутренних проектах. Исторически все классы в этом пакете были автоматически загружены через "autoload": { "classmap": ... }
и не были структурированы.
Теперь я хочу перейти на PSR-4. Я переупорядочил все файлы и каталоги в соответствии с пространствами имен классов. Пространства имен или имена классов не были изменены, были только местоположения / имена файлов.
Как мне проверить мою новую структуру файла / класса, чтобы убедиться, что она соответствует PSR-4 и все классы загружаются через "autoload": { "psr-4": ... }
? Я сделал поиск в Google, но не нашел никакого инструмента для этого.
2 ответа
Мне удалось решить мою проблему, используя подсказки из ответа Якуба Заласа(вариант 2).
Идея состоит в том, чтобы:
- Копировать работу композитора
autoload_classmap.php
вautoload_classmap-orig.php
, - Перегруппировать классы / изменить
composer.json
как требуется. - Протестируйте новую автозагрузку против карты классов orig.
Чтобы избежать ситуации, когда включение исходного файла одного класса автоматически определяет другой класс (т. Е. В одном файле определено более одного класса), каждый класс должен быть загружен в чистой среде php (отдельный запуск php-cli).
Я использовал 2 сценария для этого:
Проверка автозагрузки классов (check.php):
<?php
// test if a class, mentioned in autoload_classmap-orig.php at line $num,
// can be autoloaded. Exit status: 0 - ok, 4 - failed to autoload,
// 3 - no more classes in autoload_classmap-orig.php
error_reporting(0);
require_once(__DIR__ . "/vendor/autoload.php");
$num = $argv[1];
$classes = array_keys(include('autoload_classmap-orig.php'));
if (!isset($classes[$num])) {
exit(3);
}
$current_class = $classes[$num];
echo $current_class;
if (!class_exists($current_class)) {
exit(4);
}
exit(0);
Итератор (check.sh)
#!/usr/bin/env bash
# call ./check.php until all classes are checked or max number
# of checks reached.
max=500
num=0
while true ; do
php ./check.php $num
status=$?
case $status in
0) echo " - OK" ;;
3) echo "\nFinished." ; break ;;
4) echo " - CAN NOT BE AUTOLOADED" ;;
*) echo " - UNKNOWN ERROR $status" ;;
esac
num=$(($num + 1))
if [ "$num" -gt "$max" ] ; then
echo "\nMax number of classes reached."
break
fi
done
Опция 1
Запустите ваши тесты.
Всякий раз, когда они автоматизированы или вручную, они обнаружат любые классы, которые невозможно загрузить автоматически.
Вариант 2
Напишите простой скрипт, который бы:
- перечислить все классы PHP (FQCN)
- включить автозагрузчик composer (с настроенным psr4)
- для каждого класса попробуйте позвонить
class_exists
(что вызовет автозагрузку)
Если class_exists
сбой для данного класса, это означает, что его пространство имен не настроено должным образом.