2016-10-20 2 views
1

Ich habe ein Composer-Paket, das in internen Projekten verwendet wird. In der Vergangenheit wurden alle Klassen in diesem Paket über "autoload": { "classmap": ... } automatisch geladen und wurden nicht strukturiert.Validierung der PSR-4-Datei/Klassenstruktur (mühelose Migration zu PSR-4)

Jetzt möchte ich auf PSR-4 migrieren. Ich ordnete alle Dateien und Verzeichnisse nach Klassennamenbereichen neu an. Namensräume oder Klassennamen wurden nicht geändert, nur Dateistandorte/Namen waren.

Wie validiere ich meine neue Datei/Klassenstruktur, um sicherzustellen, dass sie PSR-4 entspricht und alle Klassen über "autoload": { "psr-4": ... } ladbar sind? Ich habe eine Google-Suche gemacht, aber kein Tool dafür gefunden.

Antwort

0

Ich konnte mein Problem mit Tipps von Jakub Zalas Antwort (Option 2) lösen.

Die Idee ist:

  1. Copy Komponisten autoload_classmap.php-autoload_classmap-orig.php arbeiten.
  2. Klassen neu anordnen/ändern composer.json wie erforderlich.
  3. Testen Sie neue Autoload gegen orig classmap.

Situation zu vermeiden, wenn die Datei definiert automatisch eine andere Klasse einer Klasse Quelle (d. H. Mehr als eine Klasse in einer Datei definiert ist), sollte jede Klasse in sauberen PHP-Umgebung (eigener php-cli run) geladen werden.

verwendet I 2-Skripte für das:

Klasse automatisch geladen Prüfer (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); 

Iterator (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

Option 1

Ihre Tests starten.

Wenn sie automatisiert oder manuell sind, zeigen sie alle Klassen an, die nicht automatisch geladen werden können.

Option 2

ein einfaches Skript schreiben, das würde:

  • Liste alle PHP-Klassen (FQCNs)
  • den Komponisten Autoloader enthalten (mit PSR4 konfiguriert)
  • für jede Klasse versuchen Sie class_exists (das wird automatisches Laden auslösen)
aufrufen

Wenn die class_exists für eine bestimmte Klasse fehlschlagen, bedeutet dies, dass der Namespace nicht richtig konfiguriert ist.

+0

Danke für einen Hinweis! Wie würde ich alle PHP-Klassen (FQCNs) auflisten? Gibt es ein Werkzeug dafür (ich könnte etwas grep/sed/awk schreiben, aber wenn es ein Werkzeug gibt, wäre es zuverlässiger). – cronfy