Das Problem ist allgemein bekannt: lib
Klassen werden ausschließlich über den Autoloader geladen und können nur wie folgt geändert werden:
- Kopieren Sie sie vollständig in einen CodePool, der vor lib geprüft wurde.
- Installieren des PSR-0-Autoloaders , Angeben einer Autoload-Klassenzuordnung und anschließendes Kopieren der Datei vollständig in diese Ordnerstruktur. [meine aktuelle Lösung]
Ich bin in einer schwierigen Situation, weil ich möglicherweise viele dieser Dateien berühren möchte - aber aus Gründen meiner Vernunft und Stabilität / Aktualisierbarkeit des Speichers möchte ich nicht ganze Bibliotheksklassen kopieren.
Jetzt gibt es natürlich mögliche Lösungen für dieses Problem, aber alle haben ihre eigenen Probleme:
- Gehen Sie auf die AOP- Route und verwenden Sie eine PHP-basierte Bibliothek wie Go! AOP : Zuletzt habe ich überprüft, dass Magento-Klassen vom Composer-Autoloader geladen werden müssen, nicht nur eine. Flyingmana hat einige Arbeiten in diesem Bereich durchgeführt, aber es ist definitiv nicht für den Einsatz in der Produktion bereit und meine Bedürfnisse sind unmittelbarer. Ich möchte auch als Erweiterung versenden, und das würde mehr Komponisten-Setup erfordern.
- Gehen Sie auf die AOP-Route und verwenden Sie eine native PHP-Erweiterung : Wahrscheinlich die derzeit günstigste, aber es müsste eine separate Erweiterung installiert werden, ganz zu schweigen davon, dass dies mit HHVM nicht funktionieren würde.
- Verwenden Sie PHPs Classkit und / oder Runkit : Es ist eine weitere native PHP-Erweiterung, die das gleiche Problem wie oben hat.
- Korrigieren Sie Aufrufseiten , um meine eigene namespaced (
\Danslo\Varien_X
) -Version zu verwenden, und erweitern Sie sie dann von der ursprünglichen (\Varien_X
): Es gibt einfach viel zu viele Aufrufseiten, um sie zu korrigieren, und dies würde eine alberne Menge von Neuschreibungen erfordern. Keine Option. Roll my own: Es sollte möglich sein:
- Schreibe meinen eigenen Autoloader.
- Kopieren Sie die ursprüngliche Klasse in einen separaten Ordner (
{root_dir}/var/tmp
) und wickeln Sie sie einnamespace \Magento { < original contents > }
. - Fügen Sie diese Datei hinzu.
- Meine geänderte Klasse einschließen
OriginalClass extends Magento\OriginalClass {}
Der Nachteil liegt auf der Hand: Dynamische Codegenerierung, Regex, ein wenig Overhead beim Laden umgeschriebener Klassen. Aber ich bin mir fast sicher, dass es zu diesem Zeitpunkt besser wäre, ~ 5000 Zeilen Code zu kopieren, wenn ich nur ~ 100 Zeilen berühren / hinzufügen möchte.
Ich weiß, dass ich viel frage, aber gibt es etwas Modernes und relativ Sauberes, das zur Lösung dieses Problems beiträgt?