लिबर फाइल को फिर से लिखने का आधुनिक तरीका


21

समस्या अच्छी तरह से जानी जाती है: libकक्षाएं केवल ऑटोलैडर के माध्यम से लोड की जाती हैं, और हम उन्हें इसके अलावा नहीं बदल सकते हैं:

  • उन्हें पूरी तरह से एक कोडपूल में कॉपी किया जाता है, जो कि पहले लिब की तुलना में जांचा जाता है।
  • PSR-0 ऑटोलैडर को स्थापित करना , एक ऑटोलॉड क्लासमेट को निर्दिष्ट करना, और उसके बाद फ़ाइल को पूरी तरह से उस संरचना संरचना में कॉपी करना। [मेरा वर्तमान समाधान]

मैं एक कठिन स्थान पर हूं क्योंकि मैं इनमें से कई फाइलों को संभावित रूप से छूना चाहता हूं - लेकिन मेरी पवित्रता और दुकान के स्थायित्व / उन्नयन के लिए पूरे पुस्तकालय वर्गों को कॉपी नहीं करना चाहते हैं।

अब स्पष्ट रूप से इस समस्या के संभावित समाधान हैं, लेकिन वे सभी अपनी समस्याओं के सेट के साथ आते हैं:

  • AOP मार्ग पर जाएं और Go जैसी PHP-आधारित लाइब्रेरी का उपयोग करें! AOP : पिछले मैंने जाँच की कि यह Magento वर्गों को संगीतकार ऑटोलैडर द्वारा लोड किए जाने की आवश्यकता होगी, न कि केवल एक उपलब्ध होने की। फ्लाइंगमैन ने इस क्षेत्र में कुछ काम किया है, लेकिन यह निश्चित रूप से उत्पादन के उपयोग के लिए तैयार नहीं है और मेरी जरूरत अधिक तत्काल है। मैं भी एक विस्तार के रूप में जहाज करना चाहता हूं, और इसके लिए अधिक संगीतकार सेटअप की आवश्यकता होगी।
  • AOP मार्ग पर जाएं और एक मूल PHP एक्सटेंशन का उपयोग करें : संभवतः इस बिंदु पर सबसे अधिक अनुकूल है, लेकिन इसे एक अलग एक्सटेंशन स्थापित करने की आवश्यकता होगी, यह उल्लेख करने के लिए नहीं कि यह एचएचवीएम के साथ काम नहीं करेगा।
  • PHP के classkit और / या runkit का उपयोग करें : यह एक और देशी PHP एक्सटेंशन है इसलिए इसमें ऊपर की तरह ही समस्या है।
  • मेरे खुद के नामस्थान ( \Danslo\Varien_X) संस्करण का उपयोग करने के लिए पैच कॉल साइटें , फिर मूल ( \Varien_X) से विस्तार करें : पैच करने के लिए बहुत अधिक कॉल करने के तरीके हैं और इसे फिर से लिखने की मूर्खतापूर्ण राशि की आवश्यकता होगी। कोई विकल्प नहीं।
  • मेरा स्वयं का रोल करें: यह संभव होना चाहिए:

    1. मेरा अपना ऑटोलैडर लिखो।
    2. मूल वर्ग को एक अलग फ़ोल्डर ( {root_dir}/var/tmp) में कॉपी करें , उसमें लपेटें namespace \Magento { < original contents > }
    3. उस फाइल को शामिल करें।
    4. मेरी संशोधित कक्षा शामिल करें OriginalClass extends Magento\OriginalClass {}

इसका नकारात्मक पक्ष स्पष्ट है: डायनामिक कोड जेनरेशन, रेगेक्स, फिर से लिखे गए वर्गों को लोड करने के लिए थोड़ा उपरि। लेकिन मुझे लगभग यकीन है कि इस बिंदु पर यह ~ 5000 लाइनों की कोडिंग को हरा देगा जब मैं सिर्फ ~ 100 लाइनों को स्पर्श / जोड़ना चाहता हूं।

मुझे पता है कि मैं बहुत कुछ पूछ रहा हूं, लेकिन क्या कुछ आधुनिक और अपेक्षाकृत साफ है जो इस समस्या को हल करने में मदद करता है?


1
क्या आपने अभी तक एलन प्रेक्षक समाधान पाया है? stackoverflow.com/a/4636662/158325
B00MER

जवाबों:



2

AOP मार्ग पर जाएं और Go जैसी PHP-आधारित लाइब्रेरी का उपयोग करें! AOP: पिछले मैंने जाँच की कि यह Magento वर्गों को संगीतकार ऑटोलैडर द्वारा लोड किए जाने की आवश्यकता होगी, न कि केवल एक उपलब्ध होने की। फ्लाइंगमैन ने इस क्षेत्र में कुछ काम किया है, लेकिन यह निश्चित रूप से उत्पादन के उपयोग के लिए तैयार नहीं है और मेरी जरूरत अधिक तत्काल है। मैं भी एक विस्तार के रूप में जहाज करना चाहता हूं, और इसके लिए अधिक संगीतकार सेटअप की आवश्यकता होगी।

मैं उस गो को जोड़ना चाहता हूं! AOP फ्रेमवर्क कंपोजर के बिना काम कर सकता है, मैं कॉन्फ़िगरेशन के साथ मदद कर सकता हूं (बस उसके लिए जीथब पर एक मुद्दा बनाएं)। आधुनिक अनुप्रयोगों के साथ पारदर्शी एकीकरण के लिए संगीतकार की आवश्यकता है।

बस के साथ include $filenameया require $filenameअपने बूटस्ट्रैप में बदलें include FilterInjectorTransformer::rewrite($filename)और गो के लिए एक ऑटोलैडर को कॉन्फ़िगर करें! एओपी ही।


1
वाह, बहुत अच्छा। मैं यह कोशिश जरूर करूंगा।
डैनियल स्लॉफ

0

ऑटोलैडर दृष्टिकोण के साथ जाएं। नाम / सभी / वर्गों में उपसर्ग के साथ परिवाद का नाम:

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

जब भी आप किसी फ़ाइल को mylib में जोड़ते हैं, तो निम्नलिखित "ओवरराइड फिक्सर" को चलाएं:

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}.phpअगर यह मौजूद है और mylib/full/path/to/class.phpअगर यह नहीं करता है और mylib/full/path/to/class.phpक्या नहीं करने के लिए ऑटोलैडर को सिखाएं ।

अपने ओवरराइड्स डालें mylib/full/path/to/class.phpऔर Oldlib_ संस्करण का विस्तार करें।

अपग्रेड केवल उपसर्ग को लिबबैक में रोलबैक / अपग्रेड करते हैं, फिर से उपसर्ग फिर से करें, ओवरराइड फिक्सर को फिर से चलाएं। जो बचा है वह सामान है जिसे अंदर ले जाया गया lib/और पहले से ओवरराइड हो गया था, लेकिन यह समस्या से संबंधित नहीं है। आपकी समस्या mylib / निर्देशिका की फ़ाइलों की संख्या हो सकती है, लेकिन मुझे विश्वास है कि आप उस हल कर सकते हैं :)।


यह दृष्टिकोण विशेष रूप से उन्नयन के संबंध में बनाए रखने के लिए बहुत सारे जोखिम और चीजों का परिचय देता है। यह "कोर को स्पर्श न करें" नियम को भी तोड़ता है। इसके अतिरिक्त, यह विस्तार डेवलपर्स के लिए एक व्यवहार्य विकल्प नहीं है।
बीप्लॉजिक

सभी उचित सम्मान के साथ ~ यद्यपि आपका समाधान काम करता है ... इसे a modernलिबास फ़ाइलों के पुनर्लेखन का तरीका नहीं माना जा सकता है । इम्पीरेटिव प्रोग्रामिंग पुराना स्कूल है;)
एडी बी

0

इसके अलावा आप कस्टम स्ट्रीम को परिभाषित कर सकते हैं और इसे ऑटोलॉड पथ के शीर्ष पर जोड़ सकते हैं। यह किसी भी ऑटोलैडर और न्यूनतम गोद लेने की आवश्यकता के साथ काम करता है। उदाहरण देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.