ম্যাজেন্টো 2: ইন্টারঅ্যাকশন করার আগে / তার আগে / পরে প্লাগইন


32

ম্যাজেন্টো 2-এ, যখন আপনি একটি "চারপাশে" প্লাগইন তৈরি করেন

public function aroundRenderResult(
    \Magento\Framework\Controller\ResultInterface $subject,
    \Closure $proceed,
    ResponseHttp $response
) {
    //...
    $proceed($response);
    //...      
}    

আপনি পরবর্তী প্লাগিনে এগিয়ে যেতে পারেন , কলটি দিয়ে আসল আসল মূল পদ্ধতিটি কল করে / $proceedপদ্ধতিতে উত্তীর্ণকে অনুরোধ করে । এটি একটি সাধারণ নকশার ধরণ যা প্রায়শই পিএইচপি ফ্রেমওয়ার্ক মিডলওয়্যার বাস্তবায়নগুলিতে দেখা যায়।

তবে - এটি বাস্তবায়নের বিশদে কিছু বিভ্রান্তি ডাব্লু / আর / টি উপস্থাপন করে। বিশেষভাবে

যদি, কোনটি ছাড়াও aroundPlugin, কোনও অবজেক্ট / বর্গের একটি beforeবা afterপ্লাগইন সংজ্ঞায়িত করা হয়, তখন তারা প্লাগইনগুলির আশেপাশের শৃঙ্খলা সম্পর্কিত কখন গুলি চালায়?

অর্থাত্ কোনও পূর্ববর্তী পদ্ধতিগুলি কোনও প্লাগইন পদ্ধতিতে আগুন লাগার আগে আগুন নেবে? বা চূড়ান্ত, বাস্তব প্রকৃত পদ্ধতির আগুনের আগে প্লাগইনগুলি কেবল আগুন নেবে ?

যে নির্দিষ্ট সমস্যাটি আমি সন্ধান করার চেষ্টা করছি তা হ'ল, ম্যাজেন্টো যখন পুরো পৃষ্ঠা ক্যাশিং মোডে থাকবে তখন আমি কোনও ম্যাগেন্টো 2 সামনের নিয়ামক প্রেরণের পদ্ধতির সাথে সংযুক্ত একটি প্লাগইন পেতে পারি না । পূর্ণ পৃষ্ঠার ক্যাশে একটি চারপাশের প্লাগইন দ্বারা পরিচালিত হয় যা কল দেয় না$proceed($response) । আমি এই প্লাগইনগুলির আশেপাশে কয়েকটি কোডের খনন করার চেষ্টা করেছি এবং প্লাগইনগুলি কীভাবে কাজ করে তার উদ্দেশ্য কীভাবে না জেনে সিস্টেমকে তার পক্ষে যুক্তি করতে অসুবিধা পেয়েছি।

যেমন - ডেভ ডক্স পৃষ্ঠায় বর্ণিত বিবরণটি প্রদর্শিত হবে, এই একটি নির্দিষ্ট উদাহরণে, ভুল হতে হবে। ডকুমেন্টেশনটি ভুল হলে এটি স্পষ্ট নয়, বা এটি যদি সম্প্রতি প্রবর্তিত বাগ হয় তবে এটি কোনও প্রান্তের কেস বা যদি আমার প্লাগইন কনফিগারেশনটি ভুল হয়।

প্রত্যক্ষ পর্যবেক্ষণ দ্বারা বা সাংস্কৃতিক জ্ঞানের দ্বারা কেউ কি জানেন যে এই অগ্রাধিকারটি কীভাবে কাজ করবে?


অ্যালান, যখন প্লাগইনে \closure $proceedবনাম বনাম ব্যবহার করবেন তখন আপনার কি থাম্বের নিয়ম রয়েছে \callable $proceed? সরকারী ডক শুধুমাত্র উল্লেখ \callableএবং এর কখনই স্পর্শ \closure
thdoan

উত্তর:


38

প্লাগইনগুলি প্রথমে সাজানোর ক্রম অনুসারে বাছাই করা হয় এবং তারপরে পদ্ধতি উপসর্গ দ্বারা।

উদাহরণ: 3 টি প্লাগইন (প্লাগইনএ, প্লাগইনবি, প্লাগইনসি) সহ নিম্নলিখিত পদ্ধতি এবং সাজানোর অর্ডার সহ পদ্ধতির জন্য:

  • প্লাগইনএ (সাজ্ট অর্ডার = 10)
    • beforeDispatch ()
    • afterDispatch ()
  • প্লাগইনবি (সাজ্ট অর্ডার = 20)
    • beforeDispatch ()
    • aroundDispatch ()
    • afterDispatch ()
  • প্লাগইনসি (সাজ্টআর্ডার = 30):
    • beforeDispatch ()
    • aroundDispatch ()
    • afterDispatch ()

মৃত্যুদন্ড কার্যকর হওয়া উচিত:

  • PluginA :: beforeDispatch ()
  • PluginB :: beforeDispatch ()
  • PluginB :: aroundDispatch ()
    • PluginC :: beforeDispatch ()
    • PluginC :: aroundDispatch ()
      • অ্যাকশন :: প্রেরণ ()
    • PluginC :: afterDispatch ()
  • PluginB :: afterDispatch ()
  • PluginA :: afterDispatch ()

16

ম্যাজেন্টো 2 টি কুকবুক থেকে:

যদি একই রকমের মূল ফাংশনটি প্রসারিত করে একাধিক প্লাগইন থাকে তবে সেগুলি নিম্নলিখিত ক্রমে কার্যকর করা হয়:

  • সর্বনিম্ন সঙ্গে আগে প্লাগইন sortOrder
  • সর্বনিম্ন সঙ্গে প্রায় প্লাগইন sortOrder
  • প্লাগইনগুলির আগে অন্যান্য (সর্বনিম্ন থেকে সর্বোচ্চ থেকে sortOrder)
  • প্লাগইনগুলির চারপাশে অন্যান্য (সর্বনিম্ন থেকে সর্বোচ্চ থেকে sortOrder)
  • সর্বোচ্চ সঙ্গে প্লাগইন sortOrder
  • প্লাগইনগুলির পরে অন্যান্য (সর্বোচ্চ থেকে নীচে থেকে sortOrder)

1

আমার জন্য এটি হিসাবে কাজ করা উচিত:

  • যদি সাজানোর ক্রমটি শূন্যের সমতুল্য সংজ্ঞায়িত না হয় (এবং এর অর্থ সত্যিকার অর্ডার অপরিজ্ঞাত)
  • প্লাগইনগুলি অর্ডার অনুসারে বাছাই করা উচিত

আপনি যদি কোডটি পর্যালোচনা করেন তবে \Magento\Framework\Interception\Interceptor::___callPlugins()দেখতে পারেন যে প্লাগইনগুলিকে $pluginInfoভেরিয়েবলের মধ্যে সঞ্চিত রাখার জন্য ডাকা হয় । এই তথ্য যেমন ইন্টারসেপ্টারে ফর্ম অটো উত্পন্ন পদ্ধতি পাস করেছে passed

public function {method}()
{
    $pluginInfo = $this->pluginList->getNext($this->subjectType, '{method}');
    if (!$pluginInfo) {
        return parent::{method}();
    } else {
        return $this->___callPlugins('{method}', func_get_args(), $pluginInfo);
    }
}

আপনি যখন দেখছেন যে \Magento\Framework\Interception\PluginListInterfaceইন্টারফেস এবং \Magento\Framework\Interception\PluginList\PluginListডিফল্ট বাস্তবায়ন প্লাগইন বাছাইয়ের জন্য দায়ী। _InheritPlugins দেখুন : 152 পদ্ধতি

/**
 * Sort items
 *
 * @param array $itemA
 * @param array $itemB
 * @return int
 */
protected function _sort($itemA, $itemB)
{
    if (isset($itemA['sortOrder'])) {
        if (isset($itemB['sortOrder'])) {
            return $itemA['sortOrder'] - $itemB['sortOrder'];
        }
        return $itemA['sortOrder'];
    } elseif (isset($itemB['sortOrder'])) {
        return $itemB['sortOrder'];
    } else {
        return 1;
    }
} 

আমার জন্য এই ফাংশনটিতে দুটি যৌক্তিক ত্রুটি রয়েছে:

  • return $itemB['sortOrder'];হওয়া উচিত return - $itemB['sortOrder'];
  • return 1; হতে হবে return 0;

আশা করি এটা তোমাকে সাহায্য করবে।


কিন্তু $ প্লাগইন ইনফো পুরোপুরি প্লাগইন সহ লোড হয়েছে? বা কিছু অলস লোড চলছে যা আচরণে প্রভাব ফেলতে পারে? একাধিক প্লাগইনগুলির জন্য বাছাইয়ের অর্ডার বলতে কী বোঝায়? যেমন এটি "প্লাগইন 1 এর আগে, প্লাগইন 1 এর আগে, প্লাগইন 1 এর পরে, প্লাগইন 2 এর আগে, প্লাগইন 2 এর আগে, প্লাগইন 2 পরে" বা "প্লাগইন 1 এর আগে", "প্লাগইন 2 এর আগে, প্লাগইন 1 এর পূর্বে, প্লাগইন 2 এর আশেপাশে" ইত্যাদি etc. কোডটি পরে দেখা যাচ্ছে, তবে "getNext" জনসাধারণ প্ল্যাগইন তথ্য একটি (সম্ভবত?) অলস লোডিংয়ের মাধ্যমে এবং কীভাবে ম্যাজেন্টো চারপাশে পুনরাবৃত্তি এড়াতে পারে তা এই সমস্ত অস্পষ্ট করে তোলে এবং কী কী বাগ রয়েছে তা স্পষ্ট করা শক্ত, কী বৈশিষ্ট্য।
অ্যালান ঝড়

Magento বাছাই প্লাগইন ক্লাস প্লাগইন পদ্ধতি।
কান্দি

এবং প্লাগইনগুলির তালিকা পরিবর্তন করা যেতে পারে, উদাহরণস্বরূপ, যদি নতুন এরিয়া আমাদের বোঝা হয়।
কান্দি

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

হতে পারে এই লিঙ্কটি কার্যকর হবে magehero.com/posts/472/magento-2-interception
KAndy
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.