Сучасний спосіб переписування файлів lib


21

Проблема добре відома: libкласи завантажуються виключно через автозавантажувач, і ми не можемо їх змінити, крім:

  • Скопіюйте їх повністю в codePool, який перевіряється раніше, ніж lib.
  • Установка PSR-0 автозавантажувач , вказавши автозагрузку classmap, а потім скопіювати файл цілком в цю структуру папок замість цього. [моє поточне рішення]

Мені важко, тому що я хочу потенційно торкнутися багатьох цих файлів, але заради моєї розумності та стабільності / оновлення магазину не хочу копіювати цілі бібліотечні класи.

Зараз, очевидно, є потенційні рішення цієї проблеми, але всі вони мають свій набір проблем:

  • Перейдіть по маршруту AOP і використовуйте бібліотеку на основі PHP, як Go! AOP : Востаннє я перевірив, що це вимагатиме завантаження Magento класів автозавантажувачем композитора, не один із них доступний. Flyingmana зробив певну роботу в цій галузі, але він точно не готовий до використання, і мої потреби є більш негайними. Я також хочу поставити як розширення, і це потребує більшої настройки композитора.
  • Перейдіть по маршруту AOP і використовуйте нативне розширення PHP : Мабуть, найбільш сприятливий на даний момент, але для цього потрібно буде встановити окреме розширення, не кажучи вже про те, що воно не буде працювати з HHVM.
  • Використовуйте класний клас PHP та / або 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 і використовуйте бібліотеку на основі PHP, як Go! AOP: Востаннє я перевірив, що це вимагатиме завантаження Magento класів автозавантажувачем композитора, не один із них доступний. Flyingmana зробив певну роботу в цій галузі, але він точно не готовий до використання, і мої потреби є більш негайними. Я також хочу поставити як розширення, і це потребує більшої настройки композитора.

Я хочу додати це Go! AOP Framework може працювати без композитора, я можу допомогти з налаштуванням (просто створіть проблему на github для цього). Композитор потрібен лише для прозорої інтеграції із сучасними додатками.

Просто замініть include $filenameабо require $filenameу вашому завантажувальному пакеті include FilterInjectorTransformer::rewrite($filename)та налаштуйте автозавантажувач для Go! АОП сам.


1
Вау приємно. Я обов’язково спробую це.
Даніель Слооф

0

Перейдіть із підходом до автозавантажувача. Перейменуйте / всі / класи в lib з префіксом:

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 / оновить його, повторно застосує префікс, запустить повторно фіксатор заміни. Залишилися речі, які перемістилися lib/і раніше були відмінені, але це не пов'язано з проблемою. Вашою проблемою може бути кількість файлів mylib / каталогу, але я вірю, що ви можете це вирішити :).


Такий підхід створює багато ризиків і особливо важливих факторів, що стосуються модернізації. Це також порушує правило "не чіпай ядро". Крім того, це не є життєздатним варіантом для розробників розширень.
beeplogic

При всій повазі ~ хоча ваше рішення працює ... це не можна вважати a modernспособом переписування файлів lib. Імперативне програмування - стара школа;)
Едді Б

0

Також ви можете визначити спеціальний потік і додати його поверх шляху автозавантаження. Він працює з будь-яким автозавантажувачем і вимагає мінімального прийняття. Див. Приклад

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.