在 Magento 2 中,Factory 类是一个用于创建模型实例的特殊类。它是设计模式中的一种工厂模式的实现,用于将对象的创建过程与其使用者分离开来。
实际上相当于Java中的@Autowired注解,magento2中用Factory类去管理Bean的实例化。
工厂类的生成:
- Magento 2 在编译时会 根据模型类的名称 自动创建生成 Factory 类。例如你在todo模组中创建了一个Model叫Bcn/todo/Model/todoModel.php,编译代码后magento2会在当前Model目录下创建一个Factory类: Bcn/todo/Model/
todoModelFactory.php
依赖注入:(一般在当前类构造函数中注入)
- 在 Magento 2 中,Factory 类通常通过依赖注入(DI)系统来注入到代码中。这意味着你可以在构造函数中接收 Factory 类作为一个成员变量,然后使用它来创建模型对象。
public function __construct( \YourVendor\YourModule\Model\YourModelFactory $yourModelFactory ) {
$this->yourModelFactory = $yourModelFactory;
}
自动解析构造函数参数:
- 当你在构造函数中注入一个 Factory 类时,Magento 2 的依赖注入系统会自动为你提供一个合适的工厂实例。你可以直接在代码中调用工厂类的
create()
方法来创建模型实例。$model = $this->yourModelFactory->create();
之后你就可以在当前类使用yourModel类中的public方法了。
使用:
- 例如新建一个topic类,如何在代码中使用topic类?
- 在topic类的构造函数_construct中声明TopicFactory参数变量$topicFactory
- 构造器中将topic工厂赋值在当前类的_topicFactory变量中
- 在函数中使用$this->_topicFactory->create();创建一个topic实例,之后在对应处使用topic中的方法(参数)。
<?php namespace Mageplaza\HelloWorld\Block; class Topic extends \Magento\Framework\View\Element\Template { protected $_topicFactory; public function _construct( \Magento\Framework\View\Element\Template\Context $context, //声明工厂类 \Mageplaza\HelloWorld\Model\TopicFactory $topicFactory ){ //构造器中注入当前类的工厂类 $this->_topicFactory = $topicFactory; parent::_construct($context); } public function _prepareLayout() { //用工厂类创建实例 $topic = $this->_topicFactory->create(); //使用实例 $collection = $topic->getCollection(); foreach($collection as $item){ var_dump($item->getData()); } exit; } }