Magento CURD
- 创建数据库表
- 创建模型-CRUD模型
Model是MVC架构的一条巨大路径。在Magento 2 CRUD中,模型具有许多不同的功能,例如管理数据,安装或升级模块。在本教程中,我只讨论数据管理CRUD。我们必须创建Model,Resource Model,Resource Model Conllection来管理表中的数据:
app/code/Mageplaza/HelloWorld/Model/Post.php
<?php namespace Mageplaza\HelloWorld\Model; class Post extends \Magento\Framework\Model\AbstractModel implements \Magento\Framework\DataObject\IdentityInterface { const CACHE_TAG = 'mageplaza_helloworld_post'; protected $_cacheTag = 'mageplaza_helloworld_post'; protected $_eventPrefix = 'mageplaza_helloworld_post'; protected function _construct() { $this->_init('Mageplaza\HelloWorld\Model\ResourceModel\Post'); } public function getIdentities() { return [self::CACHE_TAG . '_' . $this->getId()]; } public function getDefaultValues() { $values = []; return $values; } }
该模型类将扩展AbstractModel类Magento\Framework\Model\AbstractModel并实现\Magento\Framework\DataObject\IdentityInterface。IdentityInterface将强制Model类定义getIdentities()将返回模型的唯一ID 的方法。如果模型在数据库操作后需要缓存刷新并将信息呈现到前端页面,则必须仅使用此接口。
_construct()只要模型被实例化,就会调用该方法。每个CRUD模型都必须使用_construct()方法来调用_init()方法。这个_init()方法将定义实际从数据库中获取信息的资源模型。如上所述,我们定义了资源模型Mageplaza \ Post \ Model \ ResourceModel \ Post关于模型的最后一件事是你应该在模型中使用的一些变量:
1。$_eventPrefix - 要触发的事件的前缀
2。$_eventObject - 事件访问时的对象名称
3。$_cacheTag - 在缓存中使用的唯一标识符 - 创建资源模型
模型文件包含整体数据库逻辑,它不执行sql查询。资源模型将这样做。现在我们将为此表创建资源模型:
app/code/Mageplaza/HelloWorld/Model/ResourceModel/Post.php
<?php namespace Mageplaza\HelloWorld\Model\ResourceModel; class Post extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb { public function __construct( \Magento\Framework\Model\ResourceModel\Db\Context $context ) { parent::__construct($context); } protected function _construct() { $this->_init('mageplaza_helloworld_post', 'post_id'); } }
Magento中的每个CRUD资源模型都必须扩展抽象类\Magento\Framework\Model\ResourceModel\Db\AbstractDb,其中包含从数据库中获取信息的函数。
与模型类一样,此资源模型类将具有必需的方法_construct()。此方法将调用_init()函数来定义该表的表名和主键。在这个例子中,我们有表mageplaza_helloworld_post和主键post_id。
- 创建资源模型集合 - 获取模型集合
该集合模型被认为是一个资源模型使我们能够筛选和获取集合表中的数据。收集模型将放在:
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中,Factory Object也做同样的事情。
Factory类名称是Model类的名称,并附加“Factory”字样。所以对于我们的例子,我们将有PostFactory类。您不能创建此类。Magento将为您创造它。每当Magento的对象管理器遇到以“Factory”结尾的类名时,如果该类尚不存在,它将自动在var / generation文件夹中生成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(); } }
正如您在此控制器中看到的,将在_construct()函数中创建PostFactory对象。
在execute()函数中,我们$post = $this->_postFactory->create();用来创建模型对象。 - 数据对象模型
/vendor/magento/framework/DataObject.php
- -