Bazı sınıflarda, bağımlılık enjeksiyonlarının neden iki kez beyan edildiğini anlamıyorum - bir kez di.xmlsomut sınıfın yapıcısında ve içinde.
Örneğin içinde Magento\Backend\Model\Url, di.xmlDI için tanımlanan bu tipler kümesi vardır:
<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>
Ancak aynı zamanda, somut sınıfında, enjeksiyon için gerekli olan di.xml'de tanımlanan sınıflar, yapıcıda tekrar bildirilir:
<?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 = []
) {
//...
}
?>
Yukarıdaki yapıcısına bakarsak, \Magento\Framework\App\Route\ConfigInterface $routeConfigörneğin, içinde tanımlanmamıştır di.xml. Sadece kurucuda tanımlanır ve Magento hala routeConfigkullanmak için sınıfa enjekte eder , değil mi? Aynı \Magento\Framework\Encryption\EncryptorInterface $encryptorve diğerleri için.
Öyleyse, neden di.xmlyapıcıda bu bildirimleri almak için Magento'nun bu bağımlılıkları kullanım için sınıfa enjekte etmek için yeterli olduğunda hem yapıcıdaki hem de kurucudaki diğer enjeksiyonları tanımlamaya ihtiyaç vardır ?