ฉันไม่เข้าใจว่าทำไมในบางคลาสการประกาศการพึ่งพาของพวกเขาจึงถูกประกาศสองครั้ง - หนึ่งครั้งในdi.xml
และในคอนสตรัคเตอร์ของคลาสคอนกรีต
ตัวอย่างเช่นในMagento\Backend\Model\Url
, มันdi.xml
มีชุดประเภทนี้สำหรับการกำหนด DI:
<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>
แต่ในเวลาเดียวกันในคลาสที่เป็นรูปธรรมคลาสเหล่านั้นที่กำหนดใน di.xml ที่จำเป็นสำหรับการฉีดจะถูกประกาศอีกครั้งใน Constructor:
<?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 = []
) {
//...
}
?>
ถ้าเราดูที่คอนสตรัคเหนือ, ตัวอย่างเช่นไม่ได้กำหนดใน\Magento\Framework\App\Route\ConfigInterface $routeConfig
di.xml
มันถูกกำหนดในตัวสร้างเท่านั้นและ Magento จะยังคงฉีดrouteConfig
เข้าไปในชั้นเรียนเพื่อการใช้งานใช่ไหม? เหมือนกัน\Magento\Framework\Encryption\EncryptorInterface $encryptor
และอีกสองสามคน
ถ้าเช่นนั้นทำไมจึงมีความจำเป็นที่จะต้องกำหนดการฉีดอื่น ๆ ทั้งในdi.xml
และในคอนสตรัคเมื่อการประกาศเหล่านั้นในคอนสตรัคนั้นเพียงพอสำหรับวีโอไอพีที่จะฉีดการพึ่งพาเหล่านั้นลงในชั้นเรียนเพื่อใช้งาน?