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();创建模型对象。