2013-11-27 8 views
5

Ich habe Legacy-Projekt, das Deklarationen und Klassen using in verschiedenen Fällen hat.Wie fügt man die automatische Erkennung von Groß-/Kleinschreibung ohne Berücksichtigung von Groß-/Kleinschreibung ein, indem man eine von einem Compiler generierte Classmap verwendet?

Ich möchte Upgrade-Quelle in den modernen Zustand. Zuerst möchte ich die automatische Autoloading-Funktion durch automatisches Autoloading ersetzen. Aber Komponist stellt case insensitive autoloading nicht zur Verfügung.

Wie verwenden Sie Composer Classmap und unempfindliche Autoload?

Antwort

4

Fügen Sie classmap zu composer.json hinzu.

"autoload": { 
    "classmap": ["folder1/", "folder2/"] 
}, 

laufen Dann composer.phar dumpautoloadcomposer/autoload_classmap.php zu erstellen.

Ändern Sie Ihren Code. Nach

require VENDOR_PATH . '/autoload.php'; 

$class_map = require VENDOR_PATH . '/composer/autoload_classmap.php'; 
$new_class_map = array(); 
foreach ($class_map as $class => $file) 
    $new_class_map [strtolower($class)] = $file; 
unset($class_map); 
spl_autoload_register(function ($class)use($new_class_map) 
     { 
     $class = strtolower($class); 
     if (isset($new_class_map[$class])) 
      { 
      require_once $new_class_map[$class]; 
      return true; 
      } 
     else 
      return false; 
     }, true, false); 
unset($new_class_map); 

hinzufügen Dies ist der einfachste Weg, die ich gefunden habe.

2

Sie nicht - mit Komponist.

Den Code korrigieren. I.e. Verwenden Sie Composer, um eine Klassenzuordnung Ihrer Klassen zu erstellen. Führen Sie dann eine Suche nach allen diesen Klassennamen durch, bei der die Groß-/Kleinschreibung nicht berücksichtigt wird, und ersetzen Sie sie durch die korrekte Groß-/Kleinschreibung aus der Klassenzuordnung.

Oder erstellen Sie Ihren eigenen classmap loader ohne Berücksichtigung der Groß-/Kleinschreibung, der automatisch beschwert, wenn ein Klassennamen mit falschen Fällen stößt und Sie die Software nacheinander reparieren lassen - mit der Gefahr, einige Fälle zu übersehen, die erst später als Code erkannt werden Änderungen ordnen die Reihenfolge der automatisch geladenen Klassen neu an.

+3

Es schöne Lösung ist auf einmal ganz Code neu zu schreiben. Aber ich liebe kleine praktikable Änderungen. – sectus

+0

Machen Sie die Verwendung der Klassennamen einzeln nacheinander möglich. Mit Composer können Sie erkennen, welcher Name verwendet werden soll. – Sven

+1

Ich werde es tun. Aber Legacy-Code könnte Fallstricke enthalten: generierte Klassennamen, die nicht einfach umbenannt werden können. – sectus

0

Wenn Ihr Produktions-Setup spl_autoload_register unterstützt (ab 5.1.2) - können Sie eine eigene Implementierung von Autoload zusammen mit Composers hinzufügen. Hier ist, wie ich ist getan (es stützt sich auch auf Namen Abstand):

autoload.php 

<?php 
spl_autoload_register('classLoader'); 

function classLoader($className, $prefix = '') { 
    $pathParts = explode('\\', $className); 
    $newPathParts = array_map('strtolower', $pathParts); 
    $classPath = $prefix . implode(DIRECTORY_SEPARATOR, $newPathParts) . '.php'; 

    if (file_exists($classPath)) { 
    require_once $classPath; 
    } 
} 

?> 

Und in Ihren Dateien können Sie Ihren Fall mischen, was auch immer Sie mögen.

$obj = new View\Home\Home(); 

ist identisch mit:

$obj = new vIEw\home\homE();