Saya tidak mengerti mengapa, di beberapa kelas, injeksi ketergantungan mereka dideklarasikan dua kali - sekali di di.xml
dan di konstruktor kelas beton.
Misalnya dalam Magento\Backend\Model\Url
, di.xml
ini 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 $routeConfig
misalnya, tidak didefinisikan dalam di.xml
. Itu hanya didefinisikan dalam konstruktor dan Magento masih akan menyuntikkan routeConfig
ke dalam kelas untuk digunakan, bukan? Sama untuk \Magento\Framework\Encryption\EncryptorInterface $encryptor
dan beberapa lainnya.
Lalu, mengapa ada kebutuhan untuk mendefinisikan injeksi lain di kedua di.xml
dan di konstruktor ketika memiliki deklarasi di konstruktor cukup untuk Magento untuk menyuntikkan dependensi ke dalam kelas untuk digunakan?