magento2中的依赖注入主要依靠于di.xml文件中的reference和type来定义。
通过在整个<MAGENTO_DIR>目录的di.xml文件中查找<preference字符串,我们可以看到MAGENTO在其大部分模块中使用了数百个首选项定义。
让我们快速了解一下类型为Magento\Eav\Model\Attribute\Data\AbstractData的__construct方法之一:
public function __construct(\Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Psr\Log\LoggerInterface $logger, \Magento\Framework\Locale\ResolverInterface $localeResolver)
{
$this->_localeDate = $localeDate;
$this->_logger = $logger;
$this->_localeResolver = $localeResolver;
}
我们可以在<MAGENTO_DIR>/magento2-base/app/etc/di.xml文件中找到这些接口的首选项定义:
class Type {
protected $objectManager;
public
function __construct(\Magento\ Framework\ ObjectManagerInterface $objectManager) {
$this - > objectManager = $objectManager;
}
public function example() {
$this - > objectManager - > create(\Fully\ Qualified\ Class\ Name::class);
$this - > objectManager - > get(\Fully\ Qualified\ Class\ Name::class);\
Magento\ Framework\ App\ ObjectManager::getInstance() - > create(\Fully\ Qualified\ Class\ Name::class);\
Magento\ Framework\ App\ ObjectManager::getInstance() - > get(\Fully\ Qualified\ Class\ Name::class);
}
}
强烈反对直接使用objectManager,因为它可以防止工厂类提供的类型验证和类型提示。通过在整个<MAGENTO_DIR>目录的di.xml文件中查找<type字符串,我们可以看到MAGENTO在其大多数模块中使用了一千多个类型定义。
查看Magento\Customer\Model\Visitor类的源代码,我们可以看到它的构造函数是由$ignoredUserAgents=[]数组定义的。前面的示例使用type元素注入具有给定数组值的ignoredUserAgents参数。
当合并给定作用域的配置文件时,具有相同名称的数组参数将合并到一个新数组中。但是,如果以后通过更具体的作用域或通过代码加载任何新配置,则新配置中的任何数组定义都将替换加载的配置,而不是合并。
本文内容来源于码小课--magento专区:
magento-dn.png