টাইপ এবং ভার্চুয়াল টাইপের মধ্যে পার্থক্য কী


41

ইন di.xmlযে Magento2 দিয়ে আসে একটি নোড আছে typeএবং একটি নোড virtualType। আমার প্রশ্নগুলি এটি কী virtualTypeএবং এটি কোন ক্ষেত্রে পরিবর্তে ব্যবহার করা উচিত type?

কিছু জায়গায় এটি প্রতীকী লিঙ্ক বা পুনর্লিখনের মতো দেখাচ্ছে:

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">

যেখানে একটি পুরো পাথ অন্য জায়গায় পরিবর্তিত হয় তবে অন্য জায়গায় এটি সংক্ষিপ্তর নামটি সংজ্ঞায়িত করার উপায় হিসাবে ব্যবহৃত হয় বলে মনে হয়।

<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">

3
আমার কোন ধারণা (এখনও) তারা কি বলতে চাইছেন কিন্তু আপনি এখান থেকে খনন শুরু করতে পারেন: Magento\Framework\ObjectManager\Config\Mapper\Dom::convertswitchসেখানে কোথাও একটি বিবৃতি আছে।
Marius

ধন্যবাদ @ মারিয়াস, আমিও ভাবছি lessFileSourceBaseযে এক্সএমএল সীমাবদ্ধ কিনা বা এটি বাইরেও ব্যবহার করা যেতে পারে। অনুমান আমি খনন আরও ভাল।
ডেভিড ম্যানার্স

উত্তর:


84

ভার্চুয়াল প্রকারগুলি অন্যান্য শ্রেণিগুলিকে প্রভাবিত না করে বিদ্যমান শ্রেণিতে বিভিন্ন নির্ভরতা ইনজেকশনের একটি উপায়।

উদাহরণস্বরূপ, Magento\Framework\Session\Storageবর্গটি $namespaceতার নির্মাতায় একটি যুক্তি নেয় , যা মানটি 'ডিফল্ট' হিসাবে ডিফল্ট হয় এবং আপনি typeসংজ্ঞাটি নামের স্থানটিকে 'কোর' হিসাবে পরিবর্তন করতে ব্যবহার করতে পারেন ।

<type name="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</type>

উপরের কনফিগারেশনটি এটি তৈরি করবে যাতে সমস্ত দৃষ্টান্তের Magento\Framework\Session\Storage'কোর' এর নাম স্থান থাকে। ভার্চুয়াল টাইপ ব্যবহার করে একটি উপ-শ্রেণীর সমতুল্য তৈরি করার অনুমতি দেয়, যেখানে কেবলমাত্র উপ-শ্রেণীর পরিবর্তিত যুক্তির মান রয়েছে।

কোডবেসে আমরা নিম্নলিখিত দুটি কনফিগারেশন দেখতে পাচ্ছি:

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</virtualType>

<type name="Magento\Framework\Session\Generic">
    <arguments>
        <argument name="storage" xsi:type="object">Magento\Core\Model\Session\Storage</argument>
    </arguments>
</type>

প্রথম স্নিপেট একটি ভার্চুয়াল টাইপ তৈরি করে Magento\Core\Model\Session\Storageযার জন্য নাম স্থান পরিবর্তন করে, এবং দ্বিতীয়টি ভার্চুয়াল টাইপটিকে ইনজেক্ট করে Magento\Framework\Session\Generic। এটি Magento\Framework\Session\Genericঅন্যান্য শ্রেণিগুলিকেও প্রভাবিত না করে কাস্টমাইজ করার অনুমতি দেয় যা এর উপর নির্ভরতাও ঘোষণা করেMagento\Framework\Session\Storage


অনেক ধন্যবাদ @ ক্রিস অবশেষে কিছু যৌক্তিক ন্যায়বিচার পেয়েছি
সুমন-পিএইচপি

এটি ছিল সহজ এবং সেরা প্রদর্শন ration
ওমর

এই উত্তরটি আরও ভাল তবে ম্যাজেন্টো অফিশিয়াল ডক
সুমন-পিএইচপি

<type>একটি ভার্চুয়াল ক্লাস ব্যবহার করছে যা আসলে বিদ্যমান নেই। এইভাবে যুক্তি পরিবর্তনটি virtualTypeতখনই কার্যকর হবে যখন ভার্চুয়ালটাইপ ব্যবহার করে ক্লাসটি আরম্ভ করা হবে যা Magento\Framework\Session\Genericউদাহরণস্বরূপ
আরিফ আহমেদ

21

ভার্চুয়াল প্রকারগুলি বোঝার আর একটি উপায় -

ধরা যাক যে আপনার একটি ক্লাস রয়েছে \Class1, যার নিম্নলিখিত নির্মাতা রয়েছে -

public function __construct(\Class2 $argOfClass1){...}

এবং \Class2নিম্নলিখিত নির্মাণকারী রয়েছে -

public function __construct(\Class3 $argOfClass2){...}

এখন, আপনি যে ধরনের পরিবর্তন করতে চান $argOfClass2থেকে \Class3থেকে \Class4, কিন্তু শুধুমাত্র যখন \Class2হিসেবে ব্যবহার করা হয় $argOfClass1

এটি করার "পুরানো" উপায়টি হ'ল নিম্নলিখিতটি যুক্ত করা di.xml-

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

\Class5নিম্নলিখিতটি কোথায় :

class \Class5 extends \Class2{
    public function __construct(\Class4 $argOfClass2){...}
}

এই উপায়টি ব্যবহার না করে আপনি নিম্নলিখিতটি যুক্ত করে ভার্চুয়াল ধরণের ব্যবহার করতে পারেন di.xml:

<virtualType name="Class5" type="Class2">
    <arguments>
        <argument name="argOfClass2" xsi:type="string">Class4</argument>
    </arguments>
</virtualType>

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

আপনি দেখতে পাচ্ছেন, ভার্চুয়াল টাইপ ব্যবহার করে আপনাকে তৈরির কাজটি সংরক্ষণ করেছে Class5

আরও রেফারেন্সের জন্য আমি Magento2 - ভার্চুয়াল ধরণের সম্পর্কিত অ্যালান স্টর্মের নিবন্ধটি পড়ার পরামর্শ দিচ্ছি - http://alanstorm.com/magento_2_object_manage_virtual_tyype/


1
শুভ উদ্বোধন,
আনন্দ ওন্টিগেরি

সহজে বোধগম্য. যেমন একটি প্রাথমিক উদাহরণ ভাগ করে নেওয়ার জন্য ধন্যবাদ।
কল্যাণ চক্রবর্তী ভি

10

একই di.xmlফাইলে আমি দেখতে পেলাম যে lessFileSourceBaseএটি একটি আর্গুমেন্ট lessFileSourceBaseFilteredহিসাবে lessFileSourceBaseSortedপাস হয়েছে এটি একটি আর্গুমেন্ট হিসাবে প্রেরণ করা হয় এটির জন্য একটি আর্গুমেন্ট হিসাবে প্রেরণ করা হয় Magento\Framework\Less\File\Collector\Aggregated

মূল মডিউলটি ব্যতীত অন্য কোনও ফাইলে আমি lessFileSourceBase(বা lessFileSource) এর কোনও ঘটনা খুঁজে পাইনি di.xml। কেবলমাত্র কিছু ক্যাশে ফাইলগুলিতে তবে সেগুলি গুরুত্বপূর্ণ নয়।

আমার ধারণা আপনি যদি পিএইচপি ক্লাসে ভার্চুয়াল টাইপ ব্যবহার না করে থাকেন তবে কেবল diএক্সএমএল ফাইলগুলিতে আপনাকে এটিকে কোনও শ্রেণির নামের মতো দেখানোর প্রয়োজন হয় না এবং আপনি একটি উপনাম ব্যবহার করতে পারেন।

তবে এটি কেবল খাঁটি জল্পনা।
এটি কোনও শ্রেণি তৈরি করার চেষ্টা করা এবং এটির নির্মাণকর্তার সাথে lessFileSourceBaseএটি কীভাবে আচরণ করে তা দেখার একটি উদাহরণ দেওয়ার জন্য "মজা" হবে।


1
আপনি মজা শব্দের চারপাশে উদ্ধৃতিগুলি মিস করেছেন;)
ডেভিড ম্যানার্স

1
@DavidManners। ঠিক। আমি এটা ঠিক করেছি. :)
Marius

@ মারিয়াস: আপনি যদি পরিবর্তে \Magento\Framework\Session\Genericউত্স ফাইলটি পরিবর্তিত করেন তবে আপনার Magento\Core\Model\Session\Storageপরিবর্তে StorageInterface'ক্লাস ম্যাজেন্টো \ কোর \ মডেল \ সেশন \ স্টোরেজটি বিদ্যমান নেই' ব্যতিক্রম পাওয়া উচিত। কারণটি হচ্ছে যে অবজেক্টম্যানেজার ভার্চুয়াল টাইপের উদাহরণ তৈরি করে না, তবে ভার্চুয়াল টাইপ সংজ্ঞা দ্বারা উল্লিখিত কনক্রিটের ধরণের কনস্ট্রাক্টরের জন্য কী যুক্তি সরবরাহ করতে হবে তা নির্ধারণ করার জন্য এটি ব্যবহার করে ( Magento\Framework\Session\Storageউপরের উদাহরণের জন্য)।
ক্রিস ও'টুল

এটি কারখানায় দেখতে পাওয়া যায় , যেখানে $requestedTypeভার্চুয়াল ধরণের প্রতিনিধিত্ব করে এবং $typeতর্কগুলি সংগ্রহ করতে ব্যবহৃত হয়, তবে এটি একটি কংক্রিট প্রকার যা ভার্চুয়ালটাইপ মানচিত্রে অবজেক্ট ইনস্ট্যান্টেশন কলের জন্য ব্যবহৃত হয়।
ক্রিস ও'টুল

এমনকি যদি lessFileSourceBaseআরও বেশি নেমস্পেস \ শ্রেণির ধরণের শৈলীতে ছিল, তবে এটি অন্য পিএইচপি শ্রেণীর দ্বারা সরাসরি রেফারেন্সের অনুমতি দেয় না, কেবলমাত্র di.xML এর মাধ্যমে ইনজেকশনের জন্য
ক্রিস ও'টুল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.