Magento 2 Module Development
Before writing code
Fetch live docs:
- Fetch
https://developer.adobe.com/commerce/php/development/build/component-file-structure/for module structure - Fetch
https://developer.adobe.com/commerce/php/development/for development overview - Web-search
site:developer.adobe.com commerce php development buildfor build guides
Module Directory Structure
app/code/VendorName/ModuleName/
├── Api/ # Service contract interfaces
│ └── Data/ # Data interfaces
├── Block/ # View blocks
├── Console/ # CLI commands
├── Controller/ # Controllers
│ └── Adminhtml/ # Admin controllers
├── Cron/ # Cron job classes
├── etc/ # Configuration XML
│ ├── adminhtml/ # Admin-area configs
│ ├── frontend/ # Frontend configs
│ ├── module.xml # Module declaration
│ ├── di.xml # Dependency injection
│ ├── db_schema.xml # Declarative schema
│ └── db_schema_whitelist.json
├── Helper/ # Utility classes
├── Model/ # Models
│ └── ResourceModel/ # Resource models + collections
├── Observer/ # Event observers
├── Plugin/ # Interceptor classes
├── Setup/
│ └── Patch/
│ ├── Data/ # Data patches
│ └── Schema/ # Schema patches
├── Test/ # Tests
├── ViewModel/ # MVVM view models
├── view/ # Templates, layouts, JS, CSS
├── registration.php # Module registration
└── composer.json # Composer definition
Essential Files
registration.php
Registers the module with Magento's component registrar. Uses ComponentRegistrar::register() with type MODULE.
etc/module.xml
Declares the module name and sequence dependencies (modules that must load before this one).
composer.json
Package definition with type magento2-module, PSR-4 autoload mapping, and Magento module dependencies.
Data Layer Pattern
Model → Resource Model → Collection
- Model — extends
AbstractModel, represents a single entity,_construct()initializes resource model - Resource Model — extends
AbstractDb, handles CRUD against a specific table,_init()sets table and primary key - Collection — extends
AbstractCollection, represents a set of models,_init()maps model to resource model
Declarative Schema (db_schema.xml)
Since Magento 2.3+, database schema is declared in XML rather than install/upgrade scripts. The system computes diffs and applies changes automatically on setup:upgrade.
Data and Schema Patches
- Schema Patches — structural changes (add columns, modify indexes)
- Data Patches — data migrations (insert default records, transform data)
- Implement
DataPatchInterfaceorSchemaPatchInterface apply()method contains the migration logic- Patches run once and are tracked in
patch_listtable
CLI Command Pattern
Console commands extend Symfony\Component\Console\Command\Command:
- Register in
etc/di.xmlas arguments toMagento\Framework\Console\CommandListInterface - Implement
configure()for name/description andexecute()for logic
Best Practices
- Follow
VendorName_ModuleNamenaming convention - Declare all module dependencies in
module.xmlsequence - Use declarative schema instead of install/upgrade scripts
- Use data patches for data migrations
- Keep models thin — business logic in service classes
- Always define service contract interfaces in
Api/
Fetch the component file structure guide for exact directory conventions and required files before creating a module.