কিছু শ্রেণি কেন তাদের নির্মাতা এবং di.xML উভয় ক্ষেত্রে ইঞ্জেকশন সংজ্ঞায়িত করে?


12

আমি বুঝতে পারি না কেন, কিছু ক্লাসে, তাদের নির্ভরতা ইঞ্জেকশনগুলি দুবার ঘোষণা করা হয় - একবার এবং di.xmlকংক্রিটের শ্রেণীর কনস্ট্রাক্টরে।

উদাহরণস্বরূপ Magento\Backend\Model\Url, এর di.xmlডিআই সংজ্ঞায়িত করার জন্য টাইপের এই সেট রয়েছে:

<type name="Magento\Backend\Model\Url">
    <arguments>
        <argument name="scopeResolver" xsi:type="object">
Magento\Backend\Model\Url\ScopeResolver</argument>
        <argument name="authSession" xsi:type="object">
Magento\Backend\Model\Auth\Session\Proxy</argument>
        <argument name="formKey" xsi:type="object">
Magento\Framework\Data\Form\FormKey\Proxy</argument>
        <argument name="scopeType" xsi:type="const">
Magento\Store\Model\ScopeInterface::SCOPE_STORE </argument>
        <argument name="backendHelper" xsi:type="object">
Magento\Backend\Helper\Data\Proxy</argument>
    </arguments>
</type>

কিন্তু একই সময়ে, তার কংক্রিট শ্রেণিতে, ইঞ্জেকশনের জন্য ডায়.এক্সএমএল প্রয়োজনীয় সংজ্ঞাগুলি পুনরায় নির্ধারকটিতে পুনরায় ঘোষণা করা হয়:

<?php
    public function __construct(
        \Magento\Framework\App\Route\ConfigInterface $routeConfig,
        \Magento\Framework\App\RequestInterface $request,
        \Magento\Framework\Url\SecurityInfoInterface $urlSecurityInfo,
        \Magento\Framework\Url\ScopeResolverInterface $scopeResolver,
        \Magento\Framework\Session\Generic $session,
        \Magento\Framework\Session\SidResolverInterface $sidResolver,
        \Magento\Framework\Url\RouteParamsResolverFactory $routeParamsResolverFactory,
        \Magento\Framework\Url\QueryParamsResolverInterface $queryParamsResolver,
        \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
        $scopeType,
        \Magento\Backend\Helper\Data $backendHelper,
        \Magento\Backend\Model\Menu\Config $menuConfig,
        \Magento\Framework\App\CacheInterface $cache,
        \Magento\Backend\Model\Auth\Session $authSession,
        \Magento\Framework\Encryption\EncryptorInterface $encryptor,
        \Magento\Store\Model\StoreFactory $storeFactory,
        \Magento\Framework\Data\Form\FormKey $formKey,
        array $data = []
) {
    //...
}
?>

যদি আমরা উপরে এটির নির্মাণকারীর দিকে নজর রাখি \Magento\Framework\App\Route\ConfigInterface $routeConfig, উদাহরণস্বরূপ, এটিকে সংজ্ঞায়িত করা হয়নি di.xml। এটি কেবল কনস্ট্রাক্টরে সংজ্ঞায়িত করা হয়েছে এবং ম্যাজেন্টো এখনও routeConfigক্লাসে ব্যবহারের জন্য ইনজেক্ট করবে , তাই না? একই জন্য \Magento\Framework\Encryption\EncryptorInterface $encryptorএবং কয়েক অন্যান্য।

তারপরে, কেন di.xmlকনস্ট্রাক্টরগুলিতে এই ঘোষণাগুলি থাকার পরে ম্যাজেন্টো ব্যবহারের জন্য ক্লাসের মধ্যে নির্ভরশীলতাগুলি ইনজেকশনের জন্য পর্যাপ্ত হয় যখন উভয় এবং কনস্ট্রাক্টরে অন্যান্য ইঞ্জেকশনগুলি সংজ্ঞায়িত করার প্রয়োজন হয় ?

উত্তর:


15

ডকুমেন্টেশনে যেমন বলা হয়েছে , ম্যাজেন্টো 2-তে, di.xmlনিম্নলিখিতটি ব্যবহার করতে পারেন:

আপনি di.xmlআর্গুমেন্ট নোডে শ্রেণি নির্মাতা যুক্তি কনফিগার করতে পারেন । অবজেক্ট ম্যানেজার এই আর্গুমেন্টগুলি তৈরির সময় ক্লাসে ইনজেক্ট করে। এক্সএমএল ফাইলে কনফিগার করা যুক্তির নামটি অবশ্যই কনফিগার করা ক্লাসে কনস্ট্রাক্টরের প্যারামিটারের নামের সাথে মিলিত হতে পারে।

আপনার ক্ষেত্রে এটি সামান্য জটিল আমি প্রতিটি যুক্তি একে একে ব্যাখ্যা করতে যাচ্ছি:

  • \Magento\Framework\App\Route\ConfigInterface $routeConfig: এটি একটি ইন্টারফেস তাই এটি সরাসরি ব্যবহারযোগ্য নয়এই শ্রেণীর জন্য পছন্দের সংজ্ঞায়িত করা হয়app/etc/di.xml এবং এটা করা হয় Magento\Framework\App\Route\Configবর্গ
  • \Magento\Framework\App\RequestInterface $request : একই এই শ্রেণীর জন্য যায়, পছন্দ হয় Magento\Framework\App\Request\Http
  • \Magento\Framework\Url\SecurityInfoInterface $urlSecurityInfo: একই ক্ষেত্রে এখানে আবার Magento\Framework\Url\SecurityInfo\Proxyপছন্দ হিসাবে
  • \Magento\Framework\Url\ScopeResolverInterface $scopeResolver: এখানে আমরা আকর্ষণীয় বিট দিয়ে শুরু করি। ইন app/etc/di.xmlপছন্দ এই ইন্টারফেসের জন্য সংজ্ঞায়িত করা হয় এবং এটা করা হয় Magento\Framework\Url\ScopeResolverবর্গ। তবে Magento\Backend\Model\Urlম্যাজেন্টো 2-এর জন্য অন্য একটি ক্লাস ব্যবহার করা দরকার এবং এটি di.xmlআপনার পোস্ট করা কোন শ্রেণীর Magento\Backend\Model\Url\ScopeResolverজন্য ব্যবহৃত হবে তা নির্ধারণ করে।
  • \Magento\Framework\Session\Generic $session এটি একটি সাধারণ শ্রেণি এবং সুতরাং এটি হিসাবে এটি ব্যবহার করা যেতে পারে।
  • \Magento\Framework\Session\SidResolverInterface $sidResolver: একটি ইন্টারফেস ফিরে, পছন্দ এখনও সংজ্ঞায়িত করা হয় app/etc/di.xmlএবং এটি হয়Magento\Framework\Session\SidResolver\Proxy
  • \Magento\Framework\Url\RouteParamsResolverFactory $routeParamsResolverFactory : এটি একটি কারখানার শ্রেণি যাতে এটি এটি হিসাবে ব্যবহার করা যায়।
  • \Magento\Framework\Url\QueryParamsResolverInterface $queryParamsResolver: আমাদের app/etc/di.xmlএবং অগ্রাধিকার ফিরেMagento\Framework\Url\QueryParamsResolver
  • \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig: এখানে অন্য একটি ক্ষেত্রে যেখানে ** একটি পছন্দকে সংজ্ঞায়িত করা হয় app/etc/di.xmlএবং এটি Magento\Framework\App\Config
  • $scopeType: এখানে কেবল আমাদের সামনে কোনও শ্রেণি ছাড়াই একটি পরিবর্তনশীল রয়েছে able আপনার মডিউলটি di.xmlউল্লেখ করে যা Magento\Store\Model\ScopeInterface::SCOPE_STOREএই পরিবর্তনশীলটির মান হিসাবে ব্যবহার করা উচিত * **
  • \Magento\Backend\Helper\Data $backendHelper: এখানে আমরা এই শ্রেণিটিকে এটি হিসাবে ব্যবহার করতে পারি। তবে এখানে একটি প্রক্সি ব্যবহৃত হয়েছে কারণ এই শ্রেণিটি অগত্যা ব্যবহৃত হচ্ছে না (প্রক্সি ক্লাস সম্পর্কে বিশদ জানতে এই পোস্টটি দেখুন: ম্যাজেন্টো 2: প্রক্সি ক্লাস কী তার ব্যবহারিক ব্যাখ্যা? )
  • \Magento\Backend\Model\Menu\Config $menuConfig : আমরা এই শ্রেণিটিকে এটি হিসাবে ব্যবহার করতে পারি।
  • \Magento\Framework\App\CacheInterface $cache: app/etc/di.xmlএই ইন্টারফেসের জন্য নির্ধারিত অন্য পছন্দMagento\Framework\App\Cache\Proxy
  • \Magento\Backend\Model\Auth\Session $authSession: একই আবার এখানে আমরা ক্লাসটিকে এটি হিসাবে ব্যবহার করতে পারতাম তবে আমরা অলস লোডিংয়ের পরিবর্তে প্রক্সি ক্লাস ব্যবহার করি।
  • \Magento\Framework\Encryption\EncryptorInterface $encryptor: app/etc/di.xmlআবার লাফানো এবং আমরা Magento\Framework\Encryption\Encryptorএকটি পছন্দ হিসাবে খুঁজে
  • \Magento\Store\Model\StoreFactory $storeFactory : একটি কারখানা যাতে আমরা এটি এটি হিসাবে ব্যবহার করতে পারি।
  • \Magento\Framework\Data\Form\FormKey $formKey: এখানে আমরা Magento\Framework\Data\Form\FormKey\Proxyঅলস লোডিংয়ের জন্য আবারও প্রক্সি ক্লাস ব্যবহার করি ।
  • array $data = []: এটি সর্বদা সর্বশেষে আসে এবং খালি অ্যারেটিতে স্বয়ংক্রিয়ভাবে ডিফল্ট হয় আপনি এখানে আরও তথ্য পেতে পারেন: ম্যাজেন্টো 2:: ডেটা অ্যারে কনস্ট্রাক্টর পরামিতিটি কী?

সংক্ষেপ

বিশ্বব্যাপী, শ্রেণি নির্মাতা পরামিতি হ'ল ইন্টারফেস বা অস্থায়ী ক্লাস। এইভাবে di.xmlপ্রতিটি শ্রেণি নির্মাতার জন্য আপনি যে নির্ভরতাগুলি ব্যবহার করতে চান তা আপনাকে তৈরি করতে দেয়। এটি অস্থায়ী ক্লাসগুলির জন্যও বৈধ। উদাহরণস্বরূপ একটি শ্রেণি নির্মাতা যা একটি নির্মাণকারীর যুক্তি হিসাবে পণ্য শ্রেণি নেয়। এটি কনফিগারযোগ্য পণ্য মডিউল অনুসারে তৈরি করা যায় তাই এটি যুক্তি হিসাবে পরিবর্তে একটি কনফিগারযোগ্য পণ্য শ্রেণি নেয়।


ইন্টারফেস প্যারামিটারের জন্য কি সবসময় পছন্দ পছন্দ হয়? এটি কি ফ্যালব্যাক হিসাবে দেখা যাবে? কোথাও কোনও পছন্দ না রেখে কনফিগারেশনে একটি দৃ concrete় যুক্তি সংজ্ঞায়িত করা কি বোধগম্য? অথবা সম্ভব না?
রোবসচ

6

নির্ভরতা সংজ্ঞা এবং নির্ভরতা কনফিগারেশন মধ্যে পার্থক্য বুঝতে গুরুত্বপূর্ণ ।

নির্ভরতাগুলি di.xML এর মধ্যে সংজ্ঞায়িত করা হয় না। অধীনস্থ হয় কন্সট্রাকটর ভিতরে সংজ্ঞায়িত একটি ইন্টারফেস, একটি বিমূর্ত বা একটি কারখানা নির্দিষ্ট করে নিজ নিজ শ্রেণীর টাইপ নির্দিষ্ট dependecy, যেমন এর $routeConfigধরনের নির্ভরতা হয় \Magento\Framework\App\Route\ConfigInterface

অন্যদিকে, di.xmlনির্ভরতা কনফিগার করতে স্থান ব্যবহার করে <preference/>নোড এবং / অথবা xpath:type/arguments/argumentনোড (কখনও কখনও মত আরো উন্নত কনফিগারেশন নোড সঙ্গে মিলিত <virtualType/>বা <proxy/>)। নির্ভরতা কনফিগার করার অর্থ কেবল কোনও বাস্তবায়ন / অবজেক্ট / কংক্রিটের জন্য কোনও অবজেক্টের কনস্ট্রাক্টর আর্গুমেন্টকে ম্যাপ করা

আপনি ডিএ এক্সএমএলের মাধ্যমে নির্ভরতাগুলি কনফিগার করার জন্য চান যাতে আপনি সেগুলি অদলবদল করতে পারেন এবং নির্দিষ্ট অবস্থার অধীনে একটি নির্দিষ্ট ইন্টারফেস বা যুক্তির জন্য একটি পৃথক বাস্তবায়ন ব্যবহার করতে পারেন (নির্দিষ্ট শর্তের অর্থ কী বলে বোঝানো হচ্ছে তা বোঝার জন্য উদাহরণটি পড়তে থাকুন)।

উদাহরণস্বরূপ, আপনার এক্সটেনশানটি বিকাশ করার সময় আপনি প্রথমে একটি নতুন শ্রেণি তৈরি করবেন (আমরা এই নতুন শ্রেণিকে একটি বাস্তবায়ন বলি )। আপনার নতুন শ্রেণিটি \Magento\Framework\App\Route\ConfigInterfaceইন্টারফেস প্রয়োগ করে এবং এটির দেহের অভ্যন্তরে একটি কংক্রিট কার্যকারিতা রয়েছে যা ইন্টারফেস চুক্তিকে সম্মান করে। এখন কনফিগারেশন অংশটি শুরু হয় : ম্যাজেন্টোকে আপনার নতুন সংজ্ঞায়িত বাস্তবায়নটি ব্যবহার করতে বলার জন্য আপনাকে অবশ্যই অবজেক্টের নির্ভরতা হিসাবে এই বাস্তবায়নটি কনফিগার করতে হবে Magento\Backend\Model\Url। আপনি ফাইলগুলি বা আপনার মডিউলটির ভিতরে এই কনফিগারেশনটি করেন di.xml। এই ক্ষেত্রে <preference/>আপনার নতুন বাস্তবায়নের জন্য ইন্টারফেসটি মানচিত্র করতে আপনাকে নোড ব্যবহার করতে হবে । অন্যান্য সময় আপনি আরও দানাদার xpath:type/arguments/argument di.xmlনোড ব্যবহার করতে হবেনির্দিষ্ট প্রয়োগের একটি কংক্রিটের শুধুমাত্র নির্দিষ্ট যুক্তি (ওরফে নির্ভরতা, ওরফে ইন্টারফেস) মানচিত্র করুন । এখন, আপনার বাস্তবায়ন কেবলমাত্র \Magento\Backend\Model\Url কিছু শর্তে অবজেক্টের নির্ভরতা হিসাবে সক্রিয় থাকবে , উদাহরণস্বরূপ, বর্তমান অ্যাপ্লিকেশন অনুরোধের কোড সম্পাদন প্রবাহে টাইপের একটি অবজেক্ট Magento\Backend\Model\Urlতৈরি করা হচ্ছে এবং এটি কনস্ট্রাক্টর সংজ্ঞায়িত নির্ভরতার জন্য একটি প্রয়োগকরণ প্রয়োজন $routeConfigযা বলা হয় প্রকারের \Magento\Framework\App\Route\ConfigInterface

এটা অনেকটা বলার মতো:

"আরে জনাব ObjectManager! যখনই প্রকারের একটি বস্তু উদাহরণস্বরূপ Magento\Backend\Model\Urlঅনুরোধ, দয়া করে তার বর্গ কটাক্ষপাত আছে কন্সট্রাকটর সংজ্ঞা প্রথম এবং বিশ্লেষণ dependecies সংজ্ঞায়িত গণনা কর। আমি তোমাদের তারপর চূড়ান্ত ভিতরে অনুসন্ধান করতে চান, মার্জ di.xmlবর্তমান HTTP অনুরোধ এর কনফিগারেশন প্রত্যেকটি কনফিগার করা নির্ভরতার জন্য যা ম্যাজেন্টো \ ব্যাকএন্ড \ মডেল \ ইউআরএল শ্রেণীর নির্মাতাকে সংজ্ঞায়িত করা হয়েছে You আপনি আমাকে সেই কনফিগার করা নির্ভরতা বাস্তবায়ন দিন "

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