Magento 中的每个 CRUD 资源模型都必须扩展抽象类\Magento\Framework\Model\ResourceModel\Db\AbstractDb
,其中包含从数据库中获取信息的功能。
集合模型被认为是一种资源模型,它允许我们过滤和获取集合表数据。集合模型将放置在:
app/code/Mageplaza/HelloWorld/Model/ResourceModel/Post/Collection.php
该文件的内容:
<?php namespace Mageplaza\HelloWorld\Model\ResourceModel\Post; class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection{ protected $_idFieldName = 'post_id'; protected $_eventPrefix = 'mageplaza_helloworld_post_collection'; protected $_eventObject = 'post_collection'; /** * Define resource model * * @return void */ protected function _construct() { $this->_init('Mageplaza\HelloWorld\Model\Post', 'Mageplaza\HelloWorld\Model\ResourceModel\Post'); }}
CRUD 集合类必须从函数中扩展\Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
并调用_init()
初始化模型、资源模型的_construct()
方法。
我们完成了数据库表、CRUD 模型、资源模型和集合的创建。那么如何使用它们呢?
在这一部分中,我们将讨论模型的工厂对象。正如您在 OOP 中所知道的,工厂方法将用于实例化对象。在 Magento 中,工厂对象做同样的事情。
工厂类名称是模型类的名称,并附加“工厂”字样。因此,对于我们的示例,我们将拥有 PostFactory 类。您不得创建此类。Magento 将为您创建它。var/generation
每当 Magento 的对象管理器遇到以单词“Factory”结尾的类名时,如果该类尚不存在,它将自动在文件夹中生成 Factory 类。你会看到工厂类
var/generation/<vendor_name>/<module_name>/Model/ClassFactory.php
在这种情况下,它将是:
var/generation/Mageplaza/HelloWorld/Model/PostFactory.php
为了实例化模型对象,我们将使用自动构造函数依赖注入来注入工厂对象,然后使用工厂对象来实例化模型对象。
例如,我们将调用模型来获取控制器中的数据。
app/code/Mageplaza/HelloWorld/Controller/Index/Index.php
此文件的内容:
<?php namespace Mageplaza\HelloWorld\Controller\Index; class Index extends \Magento\Framework\App\Action\Action{ protected $_pageFactory; protected $_postFactory; public function __construct( \Magento\Framework\App\Action\Context $context, \Magento\Framework\View\Result\PageFactory $pageFactory, \Mageplaza\HelloWorld\Model\PostFactory $postFactory ) { $this->_pageFactory = $pageFactory; $this->_postFactory = $postFactory; return parent::__construct($context); } public function execute() { $post = $this->_postFactory->create(); $collection = $post->getCollection(); foreach($collection as $item){ echo "<pre>"; print_r($item->getData()); echo "</pre>"; } exit(); return $this->_pageFactory->create(); }}
正如您在此控制器中看到的, PostFactory 对象将在_construct()
函数中创建。在execute()
函数中,我们使用$post = $this->_postFactory->create();
创建模型对象。