Bazı sınıflarda, bağımlılık enjeksiyonlarının neden iki kez beyan edildiğini anlamıyorum - bir kez di.xml
somut sınıfın yapıcısında ve içinde.
Örneğin içinde Magento\Backend\Model\Url
, di.xml
DI 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 routeConfig
kullanmak için sınıfa enjekte eder , değil mi? Aynı \Magento\Framework\Encryption\EncryptorInterface $encryptor
ve diğerleri için.
Öyleyse, neden di.xml
yapı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 ?