Saya tidak mengerti mengapa, di beberapa kelas, injeksi ketergantungan mereka dideklarasikan dua kali - sekali di di.xmldan di konstruktor kelas beton.
Misalnya dalam Magento\Backend\Model\Url, di.xmlini memiliki set tipe untuk DI didefinisikan:
<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>
Tetapi pada saat yang sama, dalam kelas konkretnya, kelas-kelas yang didefinisikan dalam di.xml yang diperlukan untuk injeksi dinyatakan kembali dalam konstruktor:
<?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 = []
) {
//...
}
?>
Jika kita melihat konstruktornya di atas,, \Magento\Framework\App\Route\ConfigInterface $routeConfigmisalnya, tidak didefinisikan dalam di.xml. Itu hanya didefinisikan dalam konstruktor dan Magento masih akan menyuntikkan routeConfigke dalam kelas untuk digunakan, bukan? Sama untuk \Magento\Framework\Encryption\EncryptorInterface $encryptordan beberapa lainnya.
Lalu, mengapa ada kebutuhan untuk mendefinisikan injeksi lain di kedua di.xmldan di konstruktor ketika memiliki deklarasi di konstruktor cukup untuk Magento untuk menyuntikkan dependensi ke dalam kelas untuk digunakan?