magento-model-developer について
Magento 2 のデータレイヤーを設計・実装する開発者向けスキルです。エンティティモデル、スキーマ、リポジトリ、コレクション、EAV とフラットテーブルの選択、性能と整合性の指針を扱います。
主な機能
- 01エンティティとリソースモデルの設計
- 02EAV とフラットテーブルの比較
- 03リポジトリとサービス契約のパターン
- 04データベーススキーマと移行の計画
- 05コレクションとクエリの最適化
- 06検証、キャッシュ、整合性の指針
活用シーン
- 01Magento エンティティの保存方式の設計
- 02EAV またはフラットテーブル構成の選択
- 03リポジトリベースのデータアクセス実装
- 04コレクションクエリの改善とデータ整合性の維持
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ maxnorm/ magento2-agent-skills --skill magento-model-developerインストール後、Claude Code で/magento-model-developerを入力して読み込まれたか確認します。
詳細
Magento 2 モデル開発者
堅牢なデータレイヤーアーキテクチャの設計と実装を専門とし、エンタープライズ向け e コマースアプリケーションの基盤となる、効率的でスケーラブルなデータモデルを作成するエキスパートです。
使用する場面
- データモデルとエンティティを作成するとき
- データベーススキーマを設計するとき
- リポジトリパターンを実装するとき
- 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 (Entity-Attribute-Value)
- 多数のオプション属性を持つエンティティに使用します
- 柔軟な属性管理
- クエリの複雑さが増します
- 製品、顧客、カテゴリに使用します
フラットテーブル
- 固定属性を持つエンティティに使用します
- クエリのパフォーマンスが向上します
- よりシンプルなデータモデル
- 注文、見積もり、シンプルなエンティティに使用します
ベストプラクティス
パフォーマンス
- クエリの最適化: データベースクエリを最適化し、N+1 問題を排除します
- インデックス戦略: 効率的なデータベースのインデックス設計を行います
- コレクションの最適化: 適切なフィルターとページネーションを使用します
- 遅延読み込み: 負荷の高い操作には遅延読み込みを実装します
- キャッシュ: 頻繁にアクセスされるデータをキャッシュします
データの整合性
- バリデーション: 包括的なデータバリデーションを実装します
- 制約: 適切な場所でデータベース制約を使用します
- トランザクション: 複数ステップの操作にはトランザクションを使用します
- 参照整合性: 適切な外部キー関係を維持します
- データの一貫性: 操作全体でデータの一貫性を確保します
コード品質
- サービスコントラクト: リポジトリにはインターフェースを使用します
- 型ヒント: 全体を通して適切な型ヒントを使用します
- エラーハンドリング: 包括的なエラーハンドリング
- ドキュメント: データモデルとリレーションシップを文書化します
- テスト: モデルとリポジトリのテストを作成します
参考資料
エンタープライズアプリケーションの強固な基盤として機能する、効率的でスケーラブルなデータモデルの作成に注力してください。
コメント
Markdown 対応