วิธีการเขียนไฟล์ lib ใหม่ ๆ


21

ปัญหาเป็นที่รู้จักกันดี: libคลาสถูกโหลดผ่านออโต้โหลดโดยเฉพาะและเราไม่สามารถเปลี่ยนแปลงได้นอกจาก:

  • การคัดลอกทั้งหมดไปยัง codePool ที่ถูกตรวจสอบก่อนหน้า lib
  • การติดตั้งตัวโหลดอัตโนมัติ PSR-0ระบุแผนผังคลาสอัตโนมัติจากนั้นคัดลอกไฟล์ทั้งหมดลงในโครงสร้างโฟลเดอร์นั้นแทน [โซลูชันปัจจุบันของฉัน]

ฉันอยู่ในจุดที่ยากลำบากเพราะฉันต้องการสัมผัสไฟล์เหล่านี้จำนวนมาก - แต่เพื่อความมีสติและความเสถียร / ความสามารถในการอัพเกรดของฉันที่ร้านไม่ต้องการคัดลอกคลาสห้องสมุดทั้งหมด

ตอนนี้เห็นได้ชัดว่ามีวิธีแก้ปัญหาที่เป็นไปได้ แต่พวกเขาทั้งหมดมาพร้อมกับชุดของปัญหา:

  • ใช้เส้นทางAOPและใช้ไลบรารีที่เป็น PHP เช่นGo! AOP : ครั้งสุดท้ายที่ฉันตรวจสอบสิ่งนี้จะต้องโหลดคลาสวีโอไอพีโดยผู้สร้างอัตโนมัติโหลดออเดอร์ Flyingmana ทำงานบางอย่างในพื้นที่นี้ แต่มันยังไม่พร้อมสำหรับการใช้งานจริงและความต้องการของฉันก็เพิ่มขึ้นทันที ฉันยังต้องการจัดส่งเป็นส่วนขยายและนั่นจะต้องมีการตั้งค่าผู้แต่งเพิ่มเติม
  • ไปที่เส้นทาง AOP และใช้ส่วนขยาย PHP แบบเนทีฟ : อาจเป็นที่นิยมมากที่สุดในตอนนี้ แต่จะต้องติดตั้งส่วนขยายแยกต่างหากไม่ต้องพูดถึงว่าจะไม่ทำงานกับ HHVM
  • ใช้classkitของ PHP และ / หรือrunkit : เป็นอีกหนึ่งนามสกุล PHP ดั้งเดิมดังนั้นจึงมีปัญหาเช่นเดียวกับข้างต้น
  • Patch sites sites เพื่อใช้ namespaced ( \Danslo\Varien_X) ของฉันเองจากนั้นขยายจากเดิม ( \Varien_X): มีเว็บไซต์ที่จะทำการปะแก้ไขได้จำนวนมากและต้องใช้การเขียนใหม่จำนวนเล็กน้อย ไม่ใช่ตัวเลือก
  • ม้วนตัวเอง: มันควรจะเป็นไปได้ที่:

    1. เขียน autoloader ของฉันเอง
    2. คัดลอกระดับเดิมไปยังโฟลเดอร์ที่แยกต่างหาก ( {root_dir}/var/tmp) namespace \Magento { < original contents > }ห่อไว้ใน
    3. รวมไฟล์นั้น
    4. รวมคลาสที่แก้ไขของฉัน OriginalClass extends Magento\OriginalClass {}

ข้อเสียของสิ่งนี้ชัดเจน: การสร้างรหัสแบบไดนามิก, regex, ค่าใช้จ่ายเล็กน้อยสำหรับการโหลดคลาสที่เขียนใหม่ แต่ฉันเกือบจะแน่ใจว่า ณ จุดนี้มันจะเอาชนะการคัดลอกรหัส ~ 5000 บรรทัดเมื่อฉันต้องการสัมผัส / เพิ่ม ~ 100 บรรทัด

ฉันรู้ว่าฉันขออะไรมากมาย แต่มีบางสิ่งที่ทันสมัยและค่อนข้างสะอาดที่ช่วยแก้ปัญหานี้หรือไม่


1
คุณพบวิธีแก้ปัญหาผู้สังเกตการณ์ของ Alans แล้วหรือยัง stackoverflow.com/a/4636662/158325
B00MER

คำตอบ:



2

ใช้เส้นทาง AOP และใช้ไลบรารีที่เป็น PHP เช่น Go! AOP: ครั้งสุดท้ายที่ฉันตรวจสอบสิ่งนี้จะต้องโหลดคลาสวีโอไอพีโดยผู้สร้างอัตโนมัติโหลดออเดอร์ Flyingmana ทำงานบางอย่างในพื้นที่นี้ แต่มันยังไม่พร้อมสำหรับการใช้งานจริงและความต้องการของฉันก็เพิ่มขึ้นทันที ฉันยังต้องการจัดส่งเป็นส่วนขยายและนั่นจะต้องมีการตั้งค่าผู้แต่งเพิ่มเติม

ฉันต้องการเพิ่มไปที่! กรอบ AOP สามารถทำงานได้โดยไม่ต้องแต่งผมสามารถช่วยในการกำหนดค่า (เพียงแค่สร้างปัญหาเกี่ยวกับ Github สำหรับที่ นักแต่งเพลงจำเป็นสำหรับการรวมที่โปร่งใสกับแอปพลิเคชันที่ทันสมัย

เพียงแค่แทนที่include $filenameหรือrequire $filenameใน bootstrap ของคุณด้วยinclude FilterInjectorTransformer::rewrite($filename)และกำหนดค่า autoloader for Go! AOP เอง


1
ว้าวดี ฉันจะลองทำสิ่งนี้อย่างแน่นอน
Daniel Sloof

0

ใช้วิธีการโหลดอัตโนมัติ เปลี่ยนชื่อ / all / คลาสใน lib ด้วยคำนำหน้า:

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

รัน "override fixer" ต่อไปนี้ทุกครั้งที่คุณเพิ่มไฟล์ลงใน 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 / อัพเกรดนำไปใช้กับคำนำหน้าใหม่เรียกใช้ตัวแก้ไขการแทนที่ สิ่งที่เหลืออยู่คือสิ่งที่ย้ายเข้ามาlib/และถูกแทนที่ก่อนหน้านี้ แต่นั่นไม่เกี่ยวข้องกับปัญหา ปัญหาของคุณอาจเป็นจำนวนไฟล์ในไดเรกทอรี mylib / แต่ฉันเชื่อว่าคุณสามารถแก้ไขได้ :)


วิธีการนี้จะนำเสนอความเสี่ยงและสิ่งต่าง ๆ ที่จะต้องได้รับการดูแลเป็นพิเศษ นอกจากนี้ยังแบ่งกฎ "อย่าแตะต้องหลัก" นอกจากนี้มันไม่ใช่ตัวเลือกที่ทำงานได้สำหรับนักพัฒนาส่วนขยาย
beeplogic

ด้วยความเคารพa modernอย่างเต็มที่~ ถึงแม้ว่าโซลูชันของคุณจะทำงานได้ แต่ก็ไม่สามารถพิจารณาได้ว่าจะใช้วิธีการเขียนไฟล์ lib อีกครั้ง โปรแกรมเชิงซ้อนคือโรงเรียนเก่า;)
Eddie B

0

นอกจากนี้คุณสามารถกำหนดสตรีมที่กำหนดเองและเพิ่มไว้บนเส้นทางของ autoload มันทำงานกับ autoloader ใด ๆ และการยอมรับน้อยที่สุด ดูตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.