Wie überschreien Erweiterungen nicht weitrührbare Klassen?
-
16-10-2019 - |
Frage
Ich wollte eine winzige Erweiterung zusammenstellen, um es zu aktivieren Vorlage Hinweise unter globalem Umfang, aber stecken stecken geblieben, um neu zu schreiben core/template
.
Klassenumschreiben arbeiten nur für Klassen, die über eine der Methoden von Magento instanziiert sind (um dies zu tun (helper
, getModel
, getSingleton
). Für abstrakt local/Mage
überschreiben.
Zwei Fragen:
- Gibt es eine intelligente Möglichkeit zu vermeiden?
local/Mage
Zu jeder Zeit überschreiben? - Wenn es nicht gibt, wie können Sie solche Überschreibungen in Community -Erweiterungen einbeziehen?
Lösung
1) Jede Erweiterung, die Sie der Community anbieten, sollte unter dem Community Code Pool stehen.
2) Sie sollten es nicht, aber Sie können und manchmal müssen Sie weil Demeter wurde in Magento 1 viel ignoriert.
Es gibt fast immer einen Weg, um die Notwendigkeit zu überschreiben, einschließlich der Verwendung von Reflexion Wie von Vinai vor einiger Zeit erwähnt.
Wenn die Problemumgehungen zu viel Nachteil haben, müssen Sie einfach die Klassendefinition übernehmen. Sie können einen der folgenden Aussagen machen, vorausgesetzt, dass Benutzer darauf aufmerksam gemacht werden:
- Geben Sie im Community Code Pool die geänderte Definition unter Magier | VIERIEN | Zend Namespace gegebenenfalls. Mögliche Sorge wäre, dass Endbenutzer das gleiche getan haben könnte.
- Wie oben, aber in einem neuen Codepool: Vorbereiten Sie den neuen Codepool auf die Streetstapel -Pfade verwenden
set_include_path()
. Nachteil: Mehrstat()
Der durch den Autoloader verursachte und Ihre Pfadmanipulation ist nicht offensichtlich, da sie außerhalb der Bootstrap liegt. - Wenn möglich, geben Sie die Definition selbst an, bevor sie von seinem normalen Ort geladen wird, z. B. durch explizit
include()
von einem nicht standardmäßigen Standort unter Ihrem Namespace.
Klang hier draußen deine Fall-zu-Fall-Bedürfnisse-jemand hat eine Idee. Was den Vorlagenpfad betrifft, weist auf den Administratorbereich hin, Siehe meine Antwort Was nicht einmal PHP erfordert.