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?
Antworten:
Beschlossen, Go! AOP-Framework in Magento.
Siehe Danslo_Aop auf Github.
quelle
Ich möchte hinzufügen, dass Go! AOP Framework kann ohne Composer funktionieren, ich kann bei der Konfiguration helfen (erstelle dafür ein Problem bei Github). Composer wird nur für die transparente Integration in moderne Anwendungen benötigt.
Ersetzen Sie einfach ein
include $filename
oderrequire $filename
in Ihrem Bootstrap durchinclude FilterInjectorTransformer::rewrite($filename)
und konfigurieren Sie einen Autoloader für Go! AOP selbst.quelle
Fahren Sie mit dem Autoloader-Ansatz fort. Benenne / all / classes in lib mit einem Präfix um:
Führen Sie den folgenden "Override Fixer" aus, wenn Sie eine Datei zu mylib hinzufügen:
Bringen Sie dem Autoloader bei, zurückzukehren
mylib/${classname}.php
wenn er vorhanden ist, undmylib/full/path/to/class.php
wenn er es nichtmylib/full/path/to/class.php
tut und tut.Setzen Sie Ihre Außerkraftsetzungen ein
mylib/full/path/to/class.php
Geben und erweitern Sie die Oldlib_-Version.Upgrades setzen einfach das Präfix in lib / upgrade zurück, wenden das Präfix erneut an und führen den Override-Fixer erneut aus. Was übrig bleibt, sind Sachen, die eingezogen wurden
lib/
und zuvor überschrieben wurden, aber das hat nichts mit dem Problem zu tun. Ihr Problem kann die Anzahl der Dateien in der Mylib / -Verzeichnis sein, aber ich vertraue darauf, dass Sie das lösen können :).quelle
a modern
Methode zum Neuschreiben von lib-Dateien angesehen werden. Imperative Programmierung ist Old School;)Sie können auch einen benutzerdefinierten Stream definieren und diesen über dem Autoload-Pfad hinzufügen. Es funktioniert mit jedem Autoloader und erfordert nur minimale Anpassungen. Siehe Beispiel
quelle