我不明白为什么在某些类中,它们的依赖项注入要声明两次-一次在di.xml
和具体类的构造函数中进行。
例如,在中Magento\Backend\Model\Url
,di.xml
已定义了以下用于DI的类型集:
<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
在构造函数中具有这些声明足以使Magento将这些依赖项注入到类中以供使用时,为什么需要在构造函数和构造函数中都定义其他注入?