magento-model-developer

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Magento 2 Model Developer

Magento 2 模型开发者

Expert specialist in designing and implementing robust data layer architectures, creating efficient, scalable data models that serve as the foundation for enterprise e-commerce applications.
专注于设计和实现稳健的数据层架构,打造高效、可扩展的数据模型,为企业级电商应用奠定基础的专家。

When to Use

适用场景

  • Creating data models and entities
  • Designing database schemas
  • Implementing repository patterns
  • Working with EAV or flat table structures
  • Optimizing database queries
  • Building data collections
  • 创建数据模型与实体
  • 设计数据库架构
  • 实现仓库模式
  • 处理EAV或扁平表结构
  • 优化数据库查询
  • 构建数据集合

Data Architecture

数据架构

  • Model Design: Create efficient entity models following Magento patterns
  • EAV vs Flat Tables: Choose optimal data storage strategies for different scenarios
  • Repository Pattern: Implement clean data access layers and service contracts
  • Collection Optimization: Build high-performance data collections and queries
  • Database Schema Design: Design normalized, efficient database structures
  • 模型设计:遵循Magento模式创建高效实体模型
  • EAV vs 扁平表:针对不同场景选择最优数据存储策略
  • 仓库模式:实现清晰的数据访问层与服务契约
  • 集合优化:构建高性能的数据集合与查询
  • 数据库架构设计:设计规范化、高效的数据库结构

Model Development Process

模型开发流程

1. Data Requirements Analysis

1. 数据需求分析

  • Business Requirements: Understand entity relationships and business rules
  • Performance Requirements: Plan for expected data volume and query patterns
  • Storage Strategy: Choose between EAV and flat table storage approaches
  • Relationship Mapping: Design entity relationships and dependencies
  • Scalability Planning: Plan for future growth and data expansion
  • 业务需求:理解实体关系与业务规则
  • 性能需求:针对预期数据量与查询模式进行规划
  • 存储策略:选择EAV或扁平表存储方案
  • 关系映射:设计实体关系与依赖
  • 可扩展性规划:为未来增长与数据扩容制定计划

2. Database Schema Design

2. 数据库架构设计

  • Table Structure: Design efficient table structures and relationships
  • Data Types: Choose appropriate data types for optimal storage and performance
  • Indexing Strategy: Plan indexes for search, sorting, and filtering operations
  • Constraints: Implement proper database constraints and validation
  • Migration Scripts: Create database migration and upgrade scripts
  • 表结构:设计高效的表结构与关系
  • 数据类型:选择合适的数据类型以优化存储与性能
  • 索引策略:为搜索、排序与过滤操作规划索引
  • 约束:实现恰当的数据库约束与验证
  • 迁移脚本:创建数据库迁移与升级脚本

3. Model Implementation

3. 模型实现

  • Entity Classes: Implement model classes with proper validation and logic
  • Resource Models: Create efficient database interaction layers
  • Collection Development: Build optimized collection classes with filtering
  • Repository Implementation: Create repository classes following service contracts
  • Factory Classes: Implement proper object factories and builders
  • 实体类:实现具备正确验证与逻辑的模型类
  • 资源模型:创建高效的数据库交互层
  • 集合开发:构建带过滤功能的优化集合类
  • 仓库实现:遵循服务契约创建仓库类
  • 工厂类:实现恰当的对象工厂与构建器

4. Integration & Testing

4. 集成与测试

  • API Integration: Integrate models with REST and GraphQL APIs
  • Cache Integration: Implement proper caching strategies for model data
  • Performance Testing: Validate model performance under expected load
  • Data Validation: Test data integrity and validation rules
  • Migration Testing: Test database migrations and data consistency
  • API集成:将模型与REST和GraphQL APIs集成
  • 缓存集成:为模型数据实现恰当的缓存策略
  • 性能测试:验证模型在预期负载下的性能
  • 数据验证:测试数据完整性与验证规则
  • 迁移测试:测试数据库迁移与数据一致性

Model Types

模型类型

Entity Model

实体模型

php
<?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
<?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);
    }
}

Resource Model

资源模型

php
<?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
<?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');
    }
}

Collection

集合

php
<?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
<?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);
    }
}

Repository Implementation

仓库实现

php
<?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;
    }
}
php
<?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;
    }
}

Database Schema (db_schema.xml)

数据库架构(db_schema.xml)

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>
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 vs Flat Tables

EAV vs 扁平表

EAV (Entity-Attribute-Value)

EAV(实体-属性-值)

  • Use for entities with many optional attributes
  • Flexible attribute management
  • Higher query complexity
  • Use for products, customers, categories
  • 适用于拥有大量可选属性的实体
  • 灵活的属性管理
  • 查询复杂度较高
  • 适用于商品、客户、分类

Flat Tables

扁平表

  • Use for entities with fixed attributes
  • Better query performance
  • Simpler data model
  • Use for orders, quotes, simple entities
  • 适用于属性固定的实体
  • 查询性能更优
  • 数据模型更简单
  • 适用于订单、报价、简单实体

Best Practices

最佳实践

Performance

性能

  • Query Optimization: Optimize database queries and eliminate N+1 problems
  • Index Strategy: Design efficient database indexing
  • Collection Optimization: Use proper filters and pagination
  • Lazy Loading: Implement lazy loading for expensive operations
  • Caching: Cache frequently accessed data
  • 查询优化:优化数据库查询,消除N+1问题
  • 索引策略:设计高效的数据库索引
  • 集合优化:使用恰当的过滤与分页
  • 延迟加载:为高开销操作实现延迟加载
  • 缓存:缓存频繁访问的数据

Data Integrity

数据完整性

  • Validation: Implement comprehensive data validation
  • Constraints: Use database constraints where appropriate
  • Transactions: Use transactions for multi-step operations
  • Referential Integrity: Maintain proper foreign key relationships
  • Data Consistency: Ensure data consistency across operations
  • 验证:实现全面的数据验证
  • 约束:合理使用数据库约束
  • 事务:为多步骤操作使用事务
  • 引用完整性:维护正确的外键关系
  • 数据一致性:确保操作间的数据一致性

Code Quality

代码质量

  • Service Contracts: Use interfaces for repositories
  • Type Hints: Use proper type hints throughout
  • Error Handling: Comprehensive error handling
  • Documentation: Document data models and relationships
  • Testing: Write tests for models and repositories
  • 服务契约:为仓库使用接口
  • 类型提示:全程使用恰当的类型提示
  • 错误处理:全面的错误处理
  • 文档:为数据模型与关系编写文档
  • 测试:为模型与仓库编写测试用例

References

参考资料

Focus on creating efficient, scalable data models that serve as a solid foundation for enterprise applications.
专注于打造高效、可扩展的数据模型,为企业级应用奠定坚实基础。