Lib dosyalarını yeniden yazmanın modern yolu


21

Sorun iyi bilinmektedir: libsınıflar yalnızca otomatik yükleyici aracılığıyla yüklenir ve aşağıdakiler dışında bunları değiştiremeyiz:

  • Bunları tamamen lib'den daha önce kontrol edilen bir codePool'a kopyalamak.
  • Yükleme PSR-0 autoloader , bir özdevinimli_yükle ClassMap belirterek, sonra yerine o klasör yapısına tamamen dosyayı kopyalarken. [mevcut çözümüm]

Zor bir noktadayım çünkü bu dosyaların birçoğuna potansiyel olarak dokunmak istiyorum - ancak aklım ve istikrarım / mağazanın yükseltilebilirliği uğruna tüm kütüphane derslerini kopyalamak istemiyorum.

Şimdi açık bir şekilde bu sorunun potansiyel çözümleri var, ancak hepsi kendi problemleriyle geliyor:

  • AOP güzergahına gidin ve Go! AOP : Son kontrol ettiğimde Magento sınıflarının sadece bir tane değil, besteci otomatik yükleyici tarafından yüklenmesini gerektiriyor. Flyingmana bu alanda bazı çalışmalar yaptı ancak üretim kullanımına kesinlikle hazır değil ve ihtiyaçlarım daha acil. Ayrıca bir uzantı olarak gönderilmek istiyorum ve bu daha çok besteci ayarlaması gerektiriyor.
  • AOP rotasına gidin ve yerel bir PHP uzantısı kullanın : Bu noktada muhtemelen en uygun olanıdır, ancak HHVM ile çalışmayacağını belirtmek yerine ayrı bir uzantı kurmanız gerekir.
  • PHP'nin sınıf setini ve / veya runkit'ini kullan : Başka bir yerel PHP eklentisidir, bu yüzden yukarıdakiyle aynı problemi yaşar.
  • Çağrı alanlarını kendi namespaced ( \Danslo\Varien_X) \Varien_Xsürümümü kullanmak için yamalayın , sonra orijinalinden ( ) uzayın: Yama eklemek için çok fazla çağrı alanı vardır ve aptalca bir miktar yeniden yazma gerektirir. Bir seçenek değil.
  • Kendi yuvarla: Mümkün olmalıdır:

    1. Kendi otomatik yükleyicimi yaz.
    2. Orijinal sınıfı ayrı bir klasöre ( {root_dir}/var/tmp) kopyalayın , içine sarın namespace \Magento { < original contents > }.
    3. Bu dosyayı ekle.
    4. Değiştirilmiş sınıfımı dahil et OriginalClass extends Magento\OriginalClass {}

Bunun dezavantajı açıktır: Dinamik kod oluşturma, regex, yeniden yazılmış sınıfları yüklemek için biraz ek yük. Ancak bu noktada, sadece ~ 100 satır eklemek / eklemek istediğimde ~ 5000 satır kod kopyalamayı yeneceğinden neredeyse eminim.

Çok şey sorduğumu biliyorum, ama bu sorunun çözülmesine yardımcı olacak modern ve nispeten temiz bir şey var mı?


1
Henüz Alans gözlemci çözümünü buldunuz mu? stackoverflow.com/a/4636662/158325
B00MER

Yanıtlar:



2

AOP güzergahına gidin ve Go! AOP: Son kontrol ettiğimde Magento sınıflarının sadece bir tane değil, besteci otomatik yükleyici tarafından yüklenmesini gerektiriyor. Flyingmana bu alanda bazı çalışmalar yaptı ancak üretim kullanımına kesinlikle hazır değil ve ihtiyaçlarım daha acil. Ayrıca bir uzantı olarak gönderilmek istiyorum ve bu daha çok besteci ayarlaması gerektiriyor.

Bu Go’yu eklemek istiyorum! AOP çerçevesi besteci olmadan çalışabilir, yapılandırma konusunda yardımcı olabilirim (bunun için github'da bir sorun yaratın). Besteci, yalnızca modern uygulamalarla şeffaf entegrasyon için gereklidir.

Sadece include $filenameveya require $filenameönyüklemenizdeki yerini değiştirin include FilterInjectorTransformer::rewrite($filename)ve Go için bir otomatik yükleyici yapılandırın! AOP'un kendisi.


1
Vay güzel. Bunu kesinlikle deneyeceğim.
Daniel Sloof

0

Otomatik yükleyici yaklaşımı ile gidin. Lib / lib / all / sınıflarını bir önekle yeniden adlandırın:

find lib -name '*.php' -exec sed -e 's,^class ,class Oldlib_,' {} +

Mylib dosyasına bir dosya eklediğinizde, aşağıdaki "geçersiz kılma onarım yazılımını" çalıştırın:

find lib -name '*.php' -print | while read FILE
do
    classname=$(echo ${FILE}|sed -e 's,^lib/,,' -e 's,\.php$,,' -e 's,/,_,g')
    if [ ! -f mylib/${FILE#lib/} ]; then
        # ensure is_a works by providing a stub with correct classname
        echo "class ${classname} extends Oldlib_${classname} {}" > mylib/${classname}.php
    elif [ -f mylib/${classname}.php ]; then
        # we have a new override, but the old file still exists
        rm mylib/${classname}.php
    fi
done

mylib/${classname}.phpVarsa ve yoksa ve mylib/full/path/to/class.phpyaparsa geri göndermeyi otomatik yükleyiciye öğretin mylib/full/path/to/class.php.

Geçersiz kılmaları koyun mylib/full/path/to/class.phpve Oldlib_ sürümünü genişletin.

Yükseltmeler basitçe ön eki lib / yükseltme olarak geri alır, ön eki yeniden uygular, geçersiz kılma düzelticisini yeniden çalıştırın. Geride kalan, taşınan lib/ve daha önce geçersiz kılınan şeyler , ancak bu sorunla ilgili değil. Sorununuz mylib / dizinindeki dosyaların sayısı olabilir, ancak bunu çözebileceğinize güveniyorum :).


Bu yaklaşım, özellikle iyileştirmeler konusunda birçok risk ve önlem alınmasını sağlar. Aynı zamanda “çekirdeğe dokunma” kuralını da ihlal ediyor. Ek olarak, uzantı geliştiricileri için uygun bir seçenek değildir.
beeplogic

Tüm saygımla ~ çözümünüz işe yarıyor olsa da ... a modernlib dosyalarını yeniden yazma yolu olarak kabul edilemez . Zorunlu programlama eski okul;)
Eddie B

0

Ayrıca, özel Akış tanımlayabilir ve bunu otomatik yükleme yolunun üstüne ekleyebilirsiniz. Herhangi bir otomatik yükleyici ile çalışır ve asgari kullanım gerektirir. Bkz örneği

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.