ম্যাজেন্টো 2: প্লাগইন এবং পছন্দের মধ্যে মূল পার্থক্য কী?


47

আমি ম্যাজেন্টো 2 টিউটোরিয়ালে প্লাগইন এবং পছন্দ উভয়ই ব্যবহার করেছি এবং উভয়ই ভাল কাজ করছে তবে তাদের মধ্যে মূল পার্থক্যটি কী difference

প্লাগইনের জন্য কোড:

১.১) ডি.এক্সএমএলে একটি প্লাগইন ঘোষণা যুক্ত করুন:

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

1.2) একটি প্লাগইন ক্লাস তৈরি করুন:

<?php
namespace Training\Test\Model;
class Product {
public function afterGetPrice(\Magento\Catalog\Model\Product $product, $result) {
return 5;
}
}

পছন্দের জন্য কোড:

২.১) একটি অগ্রাধিকার ঘোষণা তৈরি করুন:

<preference for="Magento\Catalog\Model\Product"
type="Training\Test\Model\Testproduct" />

২.২) একটি নতুন পণ্য শ্রেণি তৈরি করুন:

<?php
namespace Training\Test\Model;
class Testproduct extends \Magento\Catalog\Model\Product
{
public function getPrice() {
return 3;
}
}

উত্তর:


59

অগ্রাধিকারটি ম্যাজেন্টো ১ থেকে ক্লাস পুনর্লিখনের সমতুল্য এটি বলা সমান, "যখনই কোড চাইবে, পরিবর্তে ClassAতাদের দিন MyClassB" instead MyClassBপ্রত্যাশা করা হয় এটি সম্পূর্ণরূপে বাস্তবায়িত হবে ClassA, এর সাথে সাথে আপনি যে আচরণটি উপরে যোগ করুন বা সংশোধন করুন।

ম্যাজেন্টো 1 এর মতো, কেবলমাত্র একটি পছন্দ (পুনর্লিখন) একসময় শ্রেণীর জন্য সক্রিয় হতে পারে যদি না আপনি সেগুলি ম্যানুয়ালি শৃঙ্খলিত করেন (যেমন MyClassBপ্রসারিত OtherClassBএবং OtherClassBপ্রসারিত ClassA)।

একটি প্লাগইন আপনাকে ক্লাসের যে পদ্ধতিতে ঝুঁকছে তার আগে, চারপাশে বা পদ্ধতিগুলির পরে কোড সম্পাদন করতে দেয়। আপনার প্লাগইন ক্লাস লক্ষ্য শ্রেণিটি প্রতিস্থাপন করে না এবং এটি এর উদাহরণ নয়। আপনি শুধু পদ্ধতি আছে before{method}, around{method}, after{method}{পদ্ধতি} লক্ষ্য বর্গ উপর থেকে সম্মান যথাযথ সময়ে মৃত্যুদন্ড কার্যকর হয়।

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

যে কারণে, প্লাগইনগুলি পছন্দগুলির চেয়ে অনেক বেশি নমনীয়। আপনার যখনই সম্ভব প্লাগইন ব্যবহার করা উচিত এবং একেবারে প্রয়োজনীয় না হলে পুনর্লিখনের ক্লাসগুলির জন্য পছন্দগুলি এড়ানো উচিত।

প্লাগইনগুলি কীভাবে কাজ করে এবং অফিসিয়াল ডকুমেন্টেশনে সেগুলি কীভাবে ব্যবহার করা যায় সে সম্পর্কে আপনি আরও পড়তে পারেন ।


পছন্দ শ্রেণিবদ্ধের সমতুল্য নয়। ইন্টারফেসের জন্য এটি ডিফল্ট বাস্তবায়ন সরবরাহ করার উপায়।
ক্যান্ডি

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

12

সহজ কথায়

ওভাররাইড শ্রেণীর জন্য পছন্দ ব্যবহার করা হয়

প্লাগইন আগে, পরে এবং তার চারপাশের পদ্ধতির কার্যকারিতা যুক্ত করার জন্য ব্যবহৃত হয়।

আপনার উদাহরণ হিসাবে:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

কোড যখনই লিস্টপ্রোডাক্টের জন্য জিজ্ঞাসা করে, অগ্রাধিকার বলেছিল

এই, পরিবর্তে ব্যবহার Vendor\MyModule\Block\Product\ListProduct করুন Magento\Catalog\Block\Product\ListProduct

<type name="Magento\Catalog\Model\Product">
<plugin name="magento-catalog-product-plugin" type="Training\Test\Model\Product" sortOrder="10"/>
</type>

কোড যখনই getPrice () এর জন্য জিজ্ঞাসা করবে, প্লাগইন এটি বলেছিল

আরে আমার ব্যবহার getPrice() পদ্ধতি আগে, পরে এবং আপনার চারপাশের getPrice() পদ্ধতি


1

সংক্ষেপে :

পছন্দ ইন্টারফেসের ডিফল্ট বাস্তবায়ন নির্দিষ্ট করতে ব্যবহৃত হয়।

প্লাগিন (ইন্টারসেপ্টর) অন্য শ্রেণীর পাবলিক পদ্ধতির আচরণ প্রসারিত করতে ব্যবহৃত হয়।

বিস্তারিত :

পছন্দ: যদি ইন্টারফেস প্রয়োগ করে এমন একাধিক শ্রেণি থাকে তবে সমস্ত প্রয়োগকৃত ক্লাসগুলির মধ্যে একটির ডিফল্ট নির্দিষ্ট করা গুরুত্বপূর্ণ। এটি নির্ভরতা ইনজেকশন ফাইল (di.xML) এর পছন্দ নোডের মাধ্যমে করা হয়।

উদাহরণ:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="Vendor\MyModule\Block\Product\ListProduct" /> 

এই ম্যাপিংটি অন্তর্ভুক্ত রয়েছে app/etc/di.xml, সুতরাং বিশ্বব্যাপী সুযোগের Magento\Core\Model\Urlজন্য যেখানেই অনুরোধ রয়েছে সেখানে অবজেক্ট ম্যানেজার বাস্তবায়ন শ্রেণিকে ইনজেকশন দেয় Magento\Core\Model\UrlInterface

প্লাগিন (ইন্টারসেপ্টর):

বলুন, একটি শ্রেণীর একটি Aপদ্ধতি রয়েছে methodAযার একটি বর্ধিত কার্যকারিতা প্রয়োজন। তারপরে, APluginএটি মূল ক্লাসটি পরিবর্তন না করে ক্লাস তৈরি করে প্লাগইনগুলির মাধ্যমে অর্জন করা হয় A। ক্লাসে APluginএমন পদ্ধতি রয়েছে যা প্রয়োজনীয় পদ্ধতির আগে, তার আগে বা তার কাছাকাছি চলে।

উদাহরণ:

<config>
    <type name="Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStock">
        <plugin name="showOutOfStockValueChanged" type="Magento\Catalog\Model\Plugin\ShowOutOfStockConfig"/>
    </type>
</config>

এই ম্যাপিংটি অ্যাপ্লিকেশন / ইত্যাদি / di.xML এ রয়েছে। এক / কয়েকটি ক্লাস Magento\CatalogInventory\Model\Config\Backend\ShowOutOfStockপদ্ধতি (গুলি) শ্রেণীর Magento\Catalog\Model\Plugin\ShowOutOfStockConfigপদ্ধতিগুলির আগে / পরে / তার আগে নির্বাহ করা হয় ।

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