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.xml
và trong hàm tạo của lớp cụ thể.
Chẳng hạn Magento\Backend\Model\Url
, nó di.xml
có 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 $routeConfig
chẳ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 routeConfig
vào lớp để sử dụng, phải không? Tương tự cho \Magento\Framework\Encryption\EncryptorInterface $encryptor
và 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.xml
và 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?