Lib ফাইলগুলি পুনরায় লেখার আধুনিক উপায়


21

সমস্যাটি সুপরিচিত: libক্লাসগুলি অটোল্যাডারের মাধ্যমে একচেটিয়াভাবে লোড করা হয়, এবং আমরা এগুলি ছাড়া অন্য কোনও পরিবর্তন করতে পারি না:

  • এগুলি সম্পূর্ণভাবে কোনও কোডপুলে অনুলিপি করা হয় যা lib এর চেয়ে আগে পরীক্ষা করা হয়।
  • পিএসআর -0 অটোলয়েডার ইনস্টল করা , একটি অটোলোড ক্লাসম্যাপ নির্দিষ্ট করে এবং তারপরে সেই ফোল্ডারের কাঠামোর মধ্যে পুরো ফাইলটি অনুলিপি করা। [আমার বর্তমান সমাধান]

আমি একটি শক্ত জায়গায় রয়েছি কারণ আমি এই ফাইলগুলির মধ্যে অনেকগুলি স্পর্শ করতে চাই - তবে আমার বিচক্ষণতা এবং স্থিতিশীলতার জন্য / স্টোরের আপগ্রেডিবিলিটির জন্য পুরো লাইব্রেরি ক্লাস অনুলিপি করতে চাই না।

এখন স্পষ্টতই এই সমস্যার সম্ভাব্য সমাধান রয়েছে তবে তারা সকলেই তাদের নিজস্ব সেটগুলির সমস্যা নিয়ে আসে:

  • এওপি রুটে যান এবং পিএইচপি-ভিত্তিক লাইব্রেরি গোয়ের মতো ব্যবহার করুন ! এওপি : সর্বশেষে আমি এটি যাচাই করেছিলাম যে এটির জন্য ম্যাজেন্টো ক্লাসগুলি কেবল একটি উপলব্ধ না হয়েই সুরকার অটোলোডার দ্বারা লোড করা প্রয়োজন। ফ্লাইংম্যানা এই এলাকায় কিছু কাজ করেছে তবে এটি অবশ্যই উত্পাদন ব্যবহারের জন্য প্রস্তুত নয় এবং আমার প্রয়োজনগুলি আরও তাত্ক্ষণিক। আমি একটি এক্সটেনশান হিসাবে জাহাজেও যেতে চাই এবং এর জন্য আরও সুরকার সেটআপ প্রয়োজন।
  • যান Aop রুট এবং ব্যবহার নেটিভ পিএইচপি এক্সটেনশন : এই সময়ে সম্ভবত সবচেয়ে অনুকূল, কিন্তু এটা একটি পৃথক এক্সটেনশন ইনস্টল করার উল্লেখ না করতে হবে এটি HHVM সঙ্গে কাজ করবে না।
  • পিএইচপি-র ক্লাসকিট এবং / অথবা রানকিট ব্যবহার করুন : এটি অন্য নেটিভ পিএইচপি এক্সটেনশন তাই এটি উপরের মতো একই সমস্যা problem
  • প্যাচ কল সাইটগুলিকে আমার নিজের নেমস্পিড ( \Danslo\Varien_X) সংস্করণটি ব্যবহার করতে হবে , তারপরে আসল ( \Varien_X) থেকে প্রসারিত করুন : প্যাচ করার জন্য খুব বেশি কলসিট রয়েছে এবং এর জন্য পুনর্লিখনের একটি নির্লিপ্ত পরিমাণের প্রয়োজন হবে। কোনও বিকল্প নয়।
  • আমার নিজস্ব রোল: এটি সম্ভব হওয়া উচিত:

    1. আমার নিজের অটোলোডার লিখুন।
    2. একটি পৃথক ফোল্ডারে ( {root_dir}/var/tmp) মূল ক্লাসটি অনুলিপি করুন , এটি মোড়ানো namespace \Magento { < original contents > }
    3. ফাইলটি অন্তর্ভুক্ত করুন।
    4. আমার সংশোধিত ক্লাস অন্তর্ভুক্ত করুন OriginalClass extends Magento\OriginalClass {}

এর নেতিবাচক দিকটি স্পষ্ট: গতিশীল কোড জেনারেশন, রেজেক্স, পুনর্লিখনের ক্লাসগুলি লোড করার জন্য একটি সামান্য ওভারহেড। তবে আমি প্রায় নিশ্চিত যে এই মুহুর্তে এটি ~ 5000 লাইন কোডের অনুলিপিটি মারবে যখন আমি কেবল just 100 টি লাইন স্পর্শ করতে / যুক্ত করতে চাই।

আমি জানি যে আমি অনেক জিজ্ঞাসা করছি, তবে সেখানে কি আধুনিক এবং তুলনামূলকভাবে পরিষ্কার কিছু রয়েছে যা এই সমস্যার সমাধান করতে সহায়তা করে?


1
আপনি কি এখনও অ্যালানস পর্যবেক্ষক সমাধান খুঁজে পেয়েছেন? stackoverflow.com/a/4636662/158325
B00MER

উত্তর:



2

এওপি রুটে যান এবং পিএইচপি-ভিত্তিক লাইব্রেরি গোয়ের মতো ব্যবহার করুন! এওপি: সর্বশেষে আমি এটি যাচাই করেছিলাম যে এটির জন্য ম্যাজেন্টো ক্লাসগুলি কেবল একটি উপলব্ধ না হয়েই সুরকার অটোলোডার দ্বারা লোড করা প্রয়োজন। ফ্লাইংম্যানা এই এলাকায় কিছু কাজ করেছে তবে এটি অবশ্যই উত্পাদন ব্যবহারের জন্য প্রস্তুত নয় এবং আমার প্রয়োজনগুলি আরও তাত্ক্ষণিক। আমি একটি এক্সটেনশান হিসাবে জাহাজেও যেতে চাই এবং এর জন্য আরও সুরকার সেটআপ প্রয়োজন।

আমি যে গো যোগ করতে চান! এওপি ফ্রেমওয়ার্কটি সুরকার ছাড়াই কাজ করতে পারে, আমি কনফিগারেশনে সহায়তা করতে পারি (কেবল এটির জন্য গিথুবে একটি সমস্যা তৈরি করতে পারি)। আধুনিক অ্যাপ্লিকেশনগুলির সাথে স্বচ্ছ সংহতকরণের জন্য সুরকার প্রয়োজন।

কেবলমাত্র একটি include $filenameবা require $filenameআপনার বুটস্ট্র্যাপে প্রতিস্থাপন করুন include FilterInjectorTransformer::rewrite($filename)এবং গো-র জন্য একটি অটোলোডার কনফিগার করুন! এওপি নিজেই।


1
বাহ সুন্দর. আমি স্পষ্টভাবে এই চেষ্টা করবে।
ড্যানিয়েল স্লোফ

0

অটোলোডার পদ্ধতির সাথে যান। একটি উপসর্গ দিয়ে lib- এ / সমস্ত / শ্রেণীর নাম পরিবর্তন করুন:

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

আপনি যে কোনও সময় মাইলিবে কোনও ফাইল যুক্ত করলে নিম্নলিখিত "ওভাররাইড ফিক্সার" চালান:

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 / upg এ রোলব্যাক করে, উপসর্গটি পুনরায় প্রয়োগ করুন, ওভাররাইড ফিক্সারটিকে আবার চালান। যা বাকী রয়েছে তা এমন উপাদান যা সরানো হয়েছিল lib/এবং পূর্বে ওভাররাইড করা হয়েছিল, তবে এটি সমস্যার সাথে সম্পর্কিত নয়। আপনার ইস্যুটি মাইলিব / ডিরেক্টরিগুলির ফাইলগুলির সংখ্যা হতে পারে, তবে আমি বিশ্বাস করি আপনি এটি সমাধান করতে পারেন :)।


এই পদ্ধতিটি বিশেষত আপগ্রেডের ক্ষেত্রে রক্ষণাবেক্ষণের জন্য প্রচুর ঝুঁকি এবং জিনিসগুলির পরিচয় দেয়। এটি "কোরটি স্পর্শ করবেন না" নিয়মটিও ভেঙে দেয়। অতিরিক্তভাবে, এটি এক্সটেনশন বিকাশকারীদের পক্ষে একটি কার্যকর বিকল্প নয়।
বিপ্লব

সমস্ত যথাযথ সম্মানের সাথে - যদিও আপনার সমাধানটি কাজ করে ... এটি a modernলিব ফাইলগুলি পুনরায় লেখার উপায় হিসাবে বিবেচনা করা যায় না । জরুরী প্রোগ্রামিংটি পুরানো স্কুল;)
এডি বি

0

এছাড়াও আপনি কাস্টম স্ট্রিম সংজ্ঞায়িত করতে এবং এটি অটোলাড পথের শীর্ষে যুক্ত করতে পারেন। এটি যে কোনও অটোলোডার এবং ন্যূনতম গ্রহণের প্রয়োজন সহ কাজ করে। উদাহরণ দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.