Ich verstehe nicht, warum in einigen Klassen ihre Abhängigkeitsinjektionen zweimal deklariert werden - einmal im di.xml
und im Konstruktor der konkreten Klasse.
Zum Beispiel in Magento\Backend\Model\Url
, der di.xml
hat 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 $routeConfig
ist er beispielsweise nicht in definiert di.xml
. Es ist nur im Konstruktor definiert und Magento wird das weiterhin routeConfig
zur Verwendung in die Klasse einfügen, nicht wahr? Gleiches gilt für \Magento\Framework\Encryption\EncryptorInterface $encryptor
und einige andere.
Warum müssen dann die anderen Injektionen in beiden di.xml
und im Konstruktor definiert werden, wenn diese Deklarationen im Konstruktor ausreichen, damit Magento diese Abhängigkeiten zur Verwendung in die Klasse einfügt?