mcpField
M
magento-model-developer

magento-model-developer

github.com/maxnorm开发31193 次安装40 周前更新
代码仓库

关于 magento-model-developer

面向 Magento 2 开发者的数据层设计与实现技能,涵盖实体模型、数据库结构、Repository、集合、EAV 或平表存储选择,以及性能和数据完整性实践。

主要功能

  1. 01实体与资源模型设计
  2. 02EAV 与平表方案取舍
  3. 03Repository 和服务契约模式
  4. 04数据库结构与迁移规划
  5. 05集合和查询优化
  6. 06验证、缓存与数据完整性实践

适用场景

  1. 01设计 Magento 实体存储
  2. 02选择 EAV 或平表结构
  3. 03实现基于 Repository 的数据访问
  4. 04优化集合查询并维护数据完整性

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/maxnorm/magento2-agent-skills --skill magento-model-developer

安装后在 Claude Code 中输入/magento-model-developer确认已加载。

详细介绍

Magento 2 模型开发者

在设计和实现稳健的数据层架构方面拥有专业专长,可创建高效、可扩展的数据模型,为企业级电子商务应用奠定基础。

适用场景

  • 创建数据模型和实体
  • 设计数据库架构
  • 实现仓储模式
  • 使用 EAV 或扁平表结构
  • 优化数据库查询
  • 构建数据集合

数据架构

  • 模型设计:遵循 Magento 模式创建高效的实体模型
  • EAV 与扁平表:为不同场景选择最优的数据存储策略
  • 仓储模式:实现清晰的数据访问层和服务契约
  • 集合优化:构建高性能的数据集合和查询
  • 数据库架构设计:设计规范、高效的数据库结构

模型开发流程

1. 数据需求分析
  • 业务需求:了解实体关系和业务规则
  • 性能需求:根据预期数据量和查询模式制定计划
  • 存储策略:选择 EAV 或扁平表存储方式
  • 关系映射:设计实体关系和依赖
  • 可扩展性规划:为未来增长和数据扩展制定计划
2. 数据库架构设计
  • 表结构:设计高效的表结构和关系
  • 数据类型:选择适当的数据类型,以优化存储和性能
  • 索引策略:为搜索、排序和筛选操作规划索引
  • 约束:实施适当的数据库约束和验证
  • 迁移脚本:创建数据库迁移和升级脚本
3. 模型实现
  • 实体类:实现包含适当验证和逻辑的模型类
  • 资源模型:创建高效的数据库交互层
  • 集合开发:构建带筛选功能的优化集合类
  • 仓储实现:遵循服务契约创建仓储类
  • 工厂类:实现适当的对象工厂和构建器
4. 集成与测试
  • API 集成:将模型集成到 REST 和 GraphQL API
  • 缓存集成:为模型数据实现适当的缓存策略
  • 性能测试:验证模型在预期负载下的性能
  • 数据验证:测试数据完整性和验证规则
  • 迁移测试:测试数据库迁移和数据一致性

模型类型

实体模型
<?php

declare(strict_types=1);

namespace Vendor\Module\Model;

use Magento\Framework\Model\AbstractModel;
use Vendor\Module\Model\ResourceModel\Entity as ResourceModel;

class Entity extends AbstractModel
{
    protected function _construct(): void
    {
        $this->_init(ResourceModel::class);
    }
}
资源模型
<?php

declare(strict_types=1);

namespace Vendor\Module\Model\ResourceModel;

use Magento\Framework\Model\ResourceModel\Db\AbstractDb;

class Entity extends AbstractDb
{
    protected function _construct(): void
    {
        $this->_init('vendor_module_entity', 'entity_id');
    }
}
集合
<?php

declare(strict_types=1);

namespace Vendor\Module\Model\ResourceModel\Entity;

use Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;
use Vendor\Module\Model\Entity;
use Vendor\Module\Model\ResourceModel\Entity as ResourceModel;

class Collection extends AbstractCollection
{
    protected function _construct(): void
    {
        $this->_init(Entity::class, ResourceModel::class);
    }
}
仓储实现
<?php

declare(strict_types=1);

namespace Vendor\Module\Model;

use Vendor\Module\Api\Data\EntityInterface;
use Vendor\Module\Api\EntityRepositoryInterface;
use Vendor\Module\Model\ResourceModel\Entity as ResourceModel;
use Magento\Framework\Exception\NoSuchEntityException;

class EntityRepository implements EntityRepositoryInterface
{
    /**
     * @param ResourceModel $resource
     */
    public function __construct(
        private readonly ResourceModel $resource
    ) {
    }

    /**
     * @param int $id
     * @return EntityInterface
     * @throws NoSuchEntityException
     */
    public function getById(int $id): EntityInterface
    {
        $entity = $this->resource->load($id);
        if (!$entity->getId()) {
            throw new NoSuchEntityException(__('Entity with id "%1" does not exist.', $id));
        }
        return $entity;
    }
}

数据库架构(db_schema.xml)

<?xml version="1.0"?>
<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
    <table name="vendor_module_entity" resource="default" engine="innodb" comment="Entity Table">
        <column xsi:type="int" name="entity_id" unsigned="true" nullable="false" identity="true" comment="Entity ID"/>
        <column xsi:type="varchar" name="name" length="255" nullable="false" comment="Name"/>
        <column xsi:type="timestamp" name="created_at" nullable="false" default="CURRENT_TIMESTAMP" comment="Created At"/>
        <constraint xsi:type="primary" referenceId="PRIMARY">
            <column name="entity_id"/>
        </constraint>
        <index referenceId="VENDOR_MODULE_ENTITY_NAME" indexType="btree">
            <column name="name"/>
        </index>
    </table>
</schema>

EAV 与扁平表

EAV(实体-属性-值)
  • 用于具有许多可选属性的实体
  • 灵活的属性管理
  • 查询复杂度较高
  • 用于产品、客户、类别
扁平表
  • 用于属性固定的实体
  • 查询性能更佳
  • 数据模型更简单
  • 用于订单、报价、简单实体

最佳实践

性能
  • 查询优化:优化数据库查询并消除 N+1 问题
  • 索引策略:设计高效的数据库索引
  • 集合优化:使用适当的筛选器和分页
  • 延迟加载:为开销较大的操作实现延迟加载
  • 缓存:缓存经常访问的数据
数据完整性
  • 验证:实施全面的数据验证
  • 约束:在适当情况下使用数据库约束
  • 事务:在多步骤操作中使用事务
  • 引用完整性:维护适当的外键关系
  • 数据一致性:确保各项操作中的数据一致性
代码质量
  • 服务契约:为存储库使用接口
  • 类型提示:全面使用恰当的类型提示
  • 错误处理:全面处理错误
  • 文档:记录数据模型及其关系
  • 测试:为模型和存储库编写测试

参考资料

专注于构建高效、可扩展的数据模型,为企业应用奠定坚实基础。

评论

支持 Markdown