Tôi không hiểu tại sao, trong một số lớp, việc tiêm phụ thuộc của chúng được khai báo hai lần - một lần trong di.xmlvà trong hàm tạo của lớp cụ thể.
Chẳng hạn Magento\Backend\Model\Url, nó di.xmlcó tập hợp các kiểu cho DI được xác định:
<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>
Nhưng đồng thời, trong lớp cụ thể của nó, các lớp được định nghĩa trong di.xml cần cho phép tiêm được khai báo lại một lần nữa trong hàm tạo:
<?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 = []
) {
//...
}
?>
Nếu chúng ta nhìn vào hàm tạo của nó ở trên, \Magento\Framework\App\Route\ConfigInterface $routeConfigchẳng hạn, không được định nghĩa trong di.xml. Nó chỉ được định nghĩa trong hàm tạo và Magento vẫn sẽ đưa routeConfigvào lớp để sử dụng, phải không? Tương tự cho \Magento\Framework\Encryption\EncryptorInterface $encryptorvà một vài người khác.
Vậy thì, tại sao cần phải xác định các phép tiêm khác trong cả hai di.xmlvà trong hàm tạo khi có các khai báo đó trong hàm tạo là đủ để Magento đưa các phụ thuộc đó vào lớp để sử dụng?