Problem jest dobrze znany: lib
klasy ładowane są wyłącznie przez autoloader i nie możemy ich zmienić inaczej niż:
- Skopiowanie ich w całości do codePool, który jest sprawdzany wcześniej niż lib.
- Instalowanie autoloadera PSR-0 , określenie mapy klas autoload, a następnie skopiowanie pliku w całości do tej struktury folderów. [moje obecne rozwiązanie]
Jestem w trudnym miejscu, ponieważ potencjalnie chcę dotknąć wielu z tych plików - ale ze względu na moje zdrowie psychiczne oraz stabilność / możliwość aktualizacji sklepu nie chcę kopiować całych klas bibliotek.
Teraz oczywiście istnieją potencjalne rozwiązania tego problemu, ale wszystkie mają swoje własne problemy:
- Przejdź na trasę AOP i skorzystaj z biblioteki opartej na PHP, takiej jak Go! AOP : Ostatnio sprawdziłem, że będzie wymagać załadowania klas Magento przez autoloader kompozytora, a nie tylko jedna dostępna. Flyingmana wykonał już pewne prace w tym obszarze, ale zdecydowanie nie jest gotowy do użycia w produkcji, a moje potrzeby są bardziej bezpośrednie. Chcę również wysłać jako rozszerzenie, a to wymagałoby większej konfiguracji kompozytora.
- Przejdź na trasę AOP i użyj natywnego rozszerzenia PHP : Prawdopodobnie najbardziej korzystne w tym momencie, ale wymagałoby to zainstalowania osobnego rozszerzenia, nie wspominając już o tym, że nie będzie działać z HHVM.
- Użyj PHP classkit i / lub runkit : to kolejne natywne rozszerzenie PHP, więc ma taki sam problem jak powyżej.
- Patchuj strony wywoławcze, aby używać mojej własnej
\Danslo\Varien_X
wersji namespaced ( ), a następnie rozszerz oryginalną (\Varien_X
): Jest po prostu zbyt wiele stron wywoławczych do łatania i wymagałoby to niemałej ilości przepisywania. Brak opcji. Rzuć własnym: Powinno być możliwe:
- Napisz własny autoloader.
- Skopiuj oryginalną klasę do osobnego folderu (
{root_dir}/var/tmp
), zawiń jąnamespace \Magento { < original contents > }
. - Dołącz ten plik.
- Uwzględnij moją zmodyfikowaną klasę
OriginalClass extends Magento\OriginalClass {}
Wada tego jest oczywista: dynamiczne generowanie kodu, regex, trochę narzutu na ładowanie przerobionych klas. Ale jestem prawie pewien, że w tym momencie byłoby lepiej skopiować ~ 5000 wierszy kodu, gdy chcę tylko dotknąć / dodać ~ 100 wierszy.
Wiem, że dużo pytam, ale czy jest coś nowoczesnego i stosunkowo czystego, co pomaga rozwiązać ten problem?