Ich verstehe nicht, warum in einigen Klassen ihre Abhängigkeitsinjektionen zweimal deklariert werden - einmal im di.xmlund im Konstruktor der konkreten Klasse.
Zum Beispiel in Magento\Backend\Model\Url, der di.xmlhat diesen Satz von Typen für DI definiert:
<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>
Gleichzeitig werden in der konkreten Klasse die in di.xml definierten Klassen, die für die Injektion erforderlich sind, im Konstruktor erneut deklariert:
<?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 = []
) {
//...
}
?>
Wenn wir uns den Konstruktor oben ansehen, \Magento\Framework\App\Route\ConfigInterface $routeConfigist er beispielsweise nicht in definiert di.xml. Es ist nur im Konstruktor definiert und Magento wird das weiterhin routeConfigzur Verwendung in die Klasse einfügen, nicht wahr? Gleiches gilt für \Magento\Framework\Encryption\EncryptorInterface $encryptorund einige andere.
Warum müssen dann die anderen Injektionen in beiden di.xmlund im Konstruktor definiert werden, wenn diese Deklarationen im Konstruktor ausreichen, damit Magento diese Abhängigkeiten zur Verwendung in die Klasse einfügt?