Проверьте структуру файла / класса PSR-4 (безболезненная миграция на PSR-4)

У меня есть пакет композитора, который используется во внутренних проектах. Исторически все классы в этом пакете были автоматически загружены через "autoload": { "classmap": ... } и не были структурированы.

Теперь я хочу перейти на PSR-4. Я переупорядочил все файлы и каталоги в соответствии с пространствами имен классов. Пространства имен или имена классов не были изменены, были только местоположения / имена файлов.

Как мне проверить мою новую структуру файла / класса, чтобы убедиться, что она соответствует PSR-4 и все классы загружаются через "autoload": { "psr-4": ... }? Я сделал поиск в Google, но не нашел никакого инструмента для этого.

2 ответа

Решение

Мне удалось решить мою проблему, используя подсказки из ответа Якуба Заласа(вариант 2).

Идея состоит в том, чтобы:

  1. Копировать работу композитора autoload_classmap.php в autoload_classmap-orig.php,
  2. Перегруппировать классы / изменить composer.json как требуется.
  3. Протестируйте новую автозагрузку против карты классов 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 сбой для данного класса, это означает, что его пространство имен не настроено должным образом.

Другие вопросы по тегам