系统学习magento二次开发,推荐小册:《Magento中文全栈二次开发 》
本小册面向Magento2以上版本,书代码及示例兼容magento2.0-2.4版本。涵盖了magento前端开发,后端开发,magento2主题,magento2重写,magento2 layout,magento2控制器,magento2 block等相关内容,带领您成为magento开发技术专家。
工厂是创建其他类的类,很像对象管理器,只是这次我们被鼓励直接使用它们。
它们的目的是实例化不可注入的类——那些我们不应该直接注入到__construct中的类。
使用工厂的美妙之处在于,大多数时候,我们甚至不必编写它们,因为它们是由Magento自动生成的,
除非我们需要为工厂类实现某种特定的行为。通过在整个<MAGENTO_DIR>目录的*.php文件中查找Factory$字符串,
我们可以看到数千个工厂示例,分布在MAGENTO的大多数模块中。虽然这些工厂中有很多是实际存在的,
但其他工厂是在需要时自动生成的。让我们快速了解一个自动生成的工厂,即Magento\Newsletter\Model\SubscriberFactory,
它用于几个Magento模块,如新闻稿、订户和评论模块:
class SubscriberFactory { protected $_objectManager = null; protected $_instanceName = null; public function __construct(\Magento\ Framework\ ObjectManagerInterface $objectManager, $instanceName = '\\Magento\\Newsletter\\Model\\Subscriber') { $this - > _objectManager = $objectManager; $this - > _instanceName = $instanceName; } public function create(array $data = array()) { return $this - > _objectManager - > create($this - > _instanceName, $data); } }
自动生成的工厂代码本质上只是对象管理器创建方法之上的一个薄包装。
工厂与di.xml首选项机制配合良好,这意味着我们可以很容易地将接口传递到构造函数中,如下所示:
public function __construct(\Magento\ CatalogInventory\ Api\ StockItemRepositoryInterface $stockItemRepository, \Magento\ CatalogInventory\ Api\ StockItemCriteriaInterfaceFactory $stockItemCriteriaFactory) { $this - > stockItemRepository = $stockItemRepository; $this - > stockItemCriteriaFactory = $stockItemCriteriaFactory; } // $criteria = $this->stockItemCriteriaFactory->create();// $result = $this->stockItemRepository->getList($criteria);
首选项机制确保在调用对象实例的构造函数时将具体实现传递给对象实例。
在开发人员模式下,Magento执行自动编译,这意味着对di.xml的更改将自动获取。
然而,有时,如果我们偶然发现意外的结果,运行bin/magento setup:di:compile控制台命令,
甚至手动清除生成的文件夹(rm-rf-generated/*)可能有助于解决问题。