मुझे समझ में नहीं आता है, कुछ वर्गों में, उनके निर्भरता इंजेक्शन को दो बार घोषित किया जाता है - एक बार 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>
लेकिन एक ही समय में, अपने ठोस वर्ग में, इंजेक्शन के लिए आवश्यक di.xml में परिभाषित उन वर्गों को फिर से कंस्ट्रक्टर में फिर से घोषित किया गया है:
<?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
। यह केवल कंस्ट्रक्टर में परिभाषित किया गया है और Magento अभी भी उपयोग के routeConfig
लिए कक्षा में इंजेक्ट करेगा, है ना? उसी के लिए \Magento\Framework\Encryption\EncryptorInterface $encryptor
और कुछ अन्य।
फिर, di.xml
जब निर्माणकर्ता उन घोषणाओं को उपयोग के लिए वर्ग में शामिल करने के लिए मैगेंटो के लिए पर्याप्त है, तो निर्माणकर्ता में दोनों में और निर्माणकर्ता में अन्य इंजेक्शनों को परिभाषित करने की आवश्यकता क्यों है ?