之前学习了如果创建一个简单的模块,包括创建目录结构,定义模块,创建registration.php
文件和 module.xml
文件,接下来要学习一下如何去实现在模块中去实现CRUD功能。
1.创建模块的基本结构
在之前Vendor_HelloWorld模块目录中添加新文件实现CRUD功能
app/
└── code/
└── Vendor/
└── HelloWorld/
├── Block/
│ └── Adminhtml/
│ └── Item/
│ ├── Edit/
│ │ └── Form.php
│ └── Edit.php
├── Controller/
│ ├── Adminhtml/
│ │ └── Item/
│ │ ├── Index.php
│ │ ├── Edit.php
│ │ ├── Save.php
│ │ ├── NewAction.php
│ │ ├── MassDelete.php
│ │ └── Delete.php
│ └── Index/
│ └── Index.php
│
├── etc/
│ ├── adminhtml/
│ │ ├── menu.xml
│ │ └── routes.xml
│ ├── frontend/
│ │ └── routes.xml
│ ├── module.xml
│ ├── acl.xml
│ └── di.xml
│
├── Model/
│ ├── ResourceModel/
│ │ ├── Item/
│ │ │ └── Collection.php
│ │ └── Item.php
│ └── Item.php
│
├── Setup/
│ └── InstallSchema.php
│
├── Ui/
│ └── Component/
│ └── Listing/
│ └── Column/
│ └── Actions.php
│
└── view/
├── adminhtml/
│ ├── layout/
│ │ ├── helloworld_item_index.xml
│ │ └── helloworld_item_edit.xml
│ └── ui_component/
│ └── helloworld_item_listing.xml
└── frontend/
├── layout/
│ └── helloworld_index_index.xml
└── templates/
└── hello.phtml
这个目录结构是在之前Vendor_HelloWorld模块中新增了一些文件以及目录,包括,CRUD操作的控制器、Model类、安装数据库的类方法,以及UI组件的目录,接下来安装这个目录来一步一步创建该模块来实现CRUD操作
2.创建InstallSchema文件
在实现CRUD操作之前,需要先通过InstallSchema文件来创建数据表,Magento的创建数据表的操作是通过创建InstallSchema文件来实现的,在该方法中去添加表的名称以及表中的字段名称、字段类型.
app/code/Vendor/HelloWorld/Setup/InstallSchema.php
<?php
namespace Vendor\HelloWorld\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;
class InstallSchema implements InstallSchemaInterface
{
public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
$setup->startSetup();
if (!$setup->tableExists('helloworld_items')) {
$table = $setup->getConnection()->newTable(
$setup->getTable('helloworld_items')
)
->addColumn(
'item_id',
Table::TYPE_INTEGER,
null,
['identity' => true, 'nullable' => false, 'primary' => true, 'unsigned' => true],
'Item ID'
)
->addColumn(
'name',
Table::TYPE_TEXT,
255,
['nullable' => false],
'Item Name'
)
->addColumn(
'description',
Table::TYPE_TEXT,
'64k',
[],
'Item Description'
)
->addColumn(
'is_active',
Table::TYPE_SMALLINT,
null,
['nullable' => false, 'default' => '1'],
'Is Active'
)
->addColumn(
'created_at',
Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => Table::TIMESTAMP_INIT],
'Created At'
)
->addColumn(
'updated_at',
Table::TYPE_TIMESTAMP,
null,
['nullable' => false, 'default' => Table::TIMESTAMP_INIT_UPDATE],
'Updated At'
)
->setComment('Helloworld Items Table');
$setup->getConnection()->createTable($table);
}
$setup->endSetup();
}
}
3.创建Model类方法
在创建完Model目录之后,首先需要创建三个类:模型类Item.php、资源模型类ResourceModel/Item.php、集合类ResourceModel/Item/Collection.php,这三个类方法是用于数据库之间进行交互。
首先创建模型类Item.php:
app/code/Vendor/HelloWorld/Model/Item.php
<?php
namespace Vendor\HelloWorld\Model;
use Magento\Framework\Model\AbstractModel;
use Vendor\HelloWorld\Api\Data\ItemInterface;
class Item extends AbstractModel implements ItemInterface
{
protected function _construct()
{
$this->_init('Vendor\HelloWorld\Model\ResourceModel\Item');
}
}
在上面的代码中,Item模型类继承自AbstractModel类,并通过_init()
方法将其与对应的资源模型类关联起来。
创建资源模型类ResourceModel/Item.php:
app/code/Vendor/HelloWorld/Model/ResourceModel/Item.php
<?php
namespace Vendor\HelloWorld\Model\ResourceModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
class Item extends AbstractDb
{
protected function _construct()
{
$this->_init('helloworld_items', 'item_id');
}
}
在这里,Item资源模型类继承自AbstractDb,并使用_init()
方法指定数据库表helloworld_items及其主键item_id。
创建集合类ResourceModel/Item/Collection.php:
app/code/Vendor/HelloWorld/Model/ResourceModel/Item/Collection.php
<?php
namespace Vendor\HelloWorld\Model\ResourceModel\Item;
use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
class Collection extends AbstractCollection
{
protected $_idFieldName = 'item_id';
protected function _construct()
{
$this->_init('Vendor\HelloWorld\Model\Item', 'Vendor\HelloWorld\Model\ResourceModel\Item');
}
}
总结
-
模型类 (Model):用于表示数据库表中的一条记录,封装数据操作的逻辑,负责对单行数据进行增删改查。
-
资源模型类 (ResourceModel):负责与数据库交互,定义数据库的具体操作。它直接与数据库表关联,实现CRUD操作。
-
集合类 (Collection):用于加载多条数据记录,通常用于展示列表。它可以实现分页、过滤和排序功能,方便在管理后台中展示数据。
通过将这三类类文件分离,Magento 2实现了数据访问逻辑和业务逻辑的解耦
4.创建控制器
创建完类方法之后,接下来需要创建用于处理CRUD操作的控制器,如Index.php、NewAction.php、Edit.php、Save.php、Delete.php
创建Index.php
创建Index作为首页的控制器
app/code/Vendor/HelloWorld/Controller/Adminhtml/Item/Index.php
<?php
namespace Vendor\HelloWorld\Controller\Adminhtml\Item;
use Magento\Backend\App\Action;
use Magento\Framework\View\Result\PageFactory;
class Index extends Action
{
protected $resultPageFactory;
public function __construct(
Action\Context $context,
PageFactory $resultPageFactory
) {
parent::__construct($context);
$this->resultPageFactory = $resultPageFactory;
}
public function execute()
{
$resultPage = $this->resultPageFactory->create();
$resultPage->setActiveMenu('Vendor_HelloWorld::item');
$resultPage->getConfig()->getTitle()->prepend(__('Items'));
return $resultPage;
}
}
创建NewAction.php
创建NewAction.php作为Edit控制器的