Composer Basics
What is Composer?
Composer is the dependency manager for PHP. It manages packages (libraries) your project needs.
Project (your Magento store)
|
+-- vendor/ (auto-generated)
| +-- autoload.php
| +-- magento/
| +-- psr/
+-- composer.json (your configuration)
+-- composer.lock (locked versions)
composer.json
{
"name": "vendor/module-name",
"description": "A custom Magento 2 module",
"type": "magento2-module",
"version": "1.0.0",
"license": "proprietary",
"require": {
"php": ">=8.1",
"magento/framework": "^103.0",
"magento/module-catalog": "^103.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.7"
},
"autoload": {
"psr-4": {
"Vendor\\Module\\": ""
}
},
"autoload-dev": {
"psr-4": {
"Vendor\\Module\\Test\\": "Test/"
}
}
}
Key Sections
| Section | Purpose |
|---|---|
| require | Production dependencies |
| require-dev | Development dependencies |
| autoload | How to load classes |
| autoload-dev | Autoloading for tests |
| scripts | Custom commands |
| extra | Package-specific config |
| repositories | Custom package sources |
Composer Commands
# Install dependencies (from composer.lock)
composer install
# Update dependencies (updates composer.lock)
composer update
# Add a new dependency
composer require vendor/package-name:^2.0
# Remove a dependency
composer remove vendor/package-name
# Update a specific package
composer update vendor/package-name
# Show installed packages
composer show
# Show outdated packages
composer outdated
# Dump autoloader (after adding classes)
composer dump-autoload
# Validate composer.json
composer validate
Version Constraints
^2.0 >=2.0.0 <3.0.0 (semver compatible)
^2.3.1 >=2.3.1 <3.0.0
~2.3 >=2.3.0 <2.4.0 (next minor)
~2.3.1 >=2.3.1 <2.4.0
* Any version
>=2.0 At least 2.0
2.0.* Any 2.0.x version
Key Takeaway
Composer manages PHP dependencies. composer.json defines what you need, composer.lock locks exact versions. Use ^ for semver compatibility, ~ for minor version limits.
Autoloading and Scripts
PSR-4 Autoloading
{
"autoload": {
"psr-4": {
"Vendor\\Module\\": "src/"
}
}
}
This maps Vendor\Module\ namespace to src/ directory:
Vendor\Module\Product -> src/Product.php
Vendor\Module\Helper\Data -> src/Helper/Data.php
Multiple Namespaces
{
"autoload": {
"psr-4": {
"Vendor\\Module\\": "",
"Vendor\\Module\\Test\\": "Test/"
}
}
}
Classmap Autoloading
{
"autoload": {
"classmap": [
"src/",
"lib/"
]
}
}
Files Autoloading
{
"autoload": {
"files": [
"src/helpers.php",
"src/constants.php"
]
}
}
Scripts
{
"scripts": {
"pre-install-cmd": "echo 'About to install...'",
"post-install-cmd": [
"@php bin/magento setup:upgrade",
"@php bin/magento cache:clean"
],
"pre-update-cmd": "echo 'About to update...'",
"post-update-cmd": "@php bin/magento setup:upgrade",
"post-root-package-install": "@php bin/magento setup:di:compile",
"test": "phpunit",
"lint": "phpcs --standard=PSR12 src/",
"format": "phpcbf --standard=PSR12 src/"
}
}
Composer Scripts for Magento
{
"scripts": {
"agento-setup": [
"@php bin/magento setup:upgrade",
"@php bin/magento setup:di:compile",
"@php bin/magento setup:static-content:deploy -f",
"@php bin/magento cache:clean"
],
"agento-reinstall": [
"@php bin/magento setup:install --force",
"@agento-setup"
]
}
}
Key Takeaway
Composer's autoload section maps namespaces to directories. Scripts automate setup tasks. Use classmap for non-PSR-4 classes and files for helper functions.
Magento's composer.json
Magento Root composer.json
{
"name": "magento/project-community-edition",
"description": "Magento Community Edition",
"type": "project",
"license": "proprietary",
"require": {
"php": ">=8.1",
"magento/framework": "^103.0",
"magento/module-backend": "^103.0",
"magento/module-catalog": "^103.0",
"magento/module-customer": "^103.0",
"magento/module-sales": "^103.0"
},
"autoload": {
"psr-4": {
"Magento\\\\": "app/code/Magento/",
"": "app/code/"
}
},
"config": {
"sort-packages": true,
"preferred-install": "dist"
},
"extra": {
"magento-force": "override"
}
}
Custom Module composer.json
{
"name": "vendor/module-name",
"description": "Custom module for specific functionality",
"type": "magento2-module",
"version": "1.0.0",
"license": "proprietary",
"require": {
"php": ">=8.1",
"magento/framework": "^103.0",
"magento/module-catalog": "^103.0",
"magento/module-customer": "^103.0"
},
"require-dev": {
"phpunit/phpunit": "^9.5",
"squizlabs/php_codesniffer": "^3.7"
},
"autoload": {
"psr-4": {
"Vendor\\Module\\": ""
},
"files": [
"registration.php"
]
},
"autoload-dev": {
"psr-4": {
"Vendor\\Module\\Test\\Unit\\": "Test/Unit/",
"Vendor\\Module\\Test\\Integration\\": "Test/Integration/"
}
},
"extra": {
"magento-core-composer-plugin": true,
"force": "override"
},
"config": {
"sort-packages": true
}
}
Installing a Custom Module via Composer
# From private repository
composer require vendor/module-name:@stable
# From local path (for development)
composer config repositories.local path /path/to/module
composer require vendor/module-name:@dev
# From Git repository
composer config repositories.vcs https://github.com/vendor/module.git
composer require vendor/module-name:dev-main
Magento Module Installation Flow
1. composer require vendor/module
-> Downloads module to vendor/vendor/module
2. composer.json autoload maps namespace
-> Vendor\Module\ -> vendor/vendor/module/
3. registration.php registers module
-> ComponentRegistrar::register(MODULE, 'Vendor_Module', ...)
4. bin/magento setup:upgrade
-> Reads module.xml, db_schema.xml
-> Creates/updates database tables
5. bin/magento setup:di:compile
-> Generates dependency injection code
-> Creates proxy and factory classes
Key Takeaway
Magento modules follow a specific composer.json structure with type 'magento2-module'. Registration happens through both composer.json autoload and registration.php. Always run setup:upgrade after installing new modules.
Quiz
1. What is the difference between composer install and composer update?
2. What does ^2.0 mean in version constraints?
3. What does composer dump-autoload do?
4. What is the 'type' field in a Magento module's composer.json?
5. What must you run after installing a new Magento module?
Flashcards
Question
What is composer.json?
Click to reveal answer
Answer
The configuration file that defines your project's dependencies, autoloading rules, scripts, and other metadata. Read by Composer to manage packages.
Question
What is composer.lock?
Click to reveal answer
Answer
Locks exact versions of all installed dependencies. Ensures consistent installations across environments. Generated by composer update.
Question
What does ^2.0 version constraint mean?
Click to reveal answer
Answer
Greater than or equal to 2.0.0, less than 3.0.0. Semver compatible - allows updates within the same major version.
Question
What does composer require do?
Click to reveal answer
Answer
Adds a new dependency to composer.json and installs it. Example: composer require vendor/package:^2.0
Question
What is the type field in Magento composer.json?
Click to reveal answer
Answer
magento2-module - identifies the package as a Magento module that should be managed by the Magento framework.
Question
What autoload section does a Magento module use?
Click to reveal answer
Answer
PSR-4: maps the module's namespace to its root directory. Example: "Vendor\\Module\\": "" maps to the module's root.
Question
What scripts can you define in composer.json?
Click to reveal answer
Answer
pre-install-cmd, post-install-cmd, pre-update-cmd, post-update-cmd, and custom scripts. Used for setup automation.
Question
What is the preferred-install config option?
Click to reveal answer
Answer
dist: downloads zip archive (faster). source: clones git repository (better for development). Default is dist.
Revision Notes
Key Takeaways
- 1. composer.json defines dependencies, autoloading, and scripts
- 2. composer.lock locks exact versions for consistent installations
- 3. ^2.0 means >=2.0.0 <3.0.0 (semver compatible)
- 4. composer install reads lock file, composer update resolves new versions
- 5. Magento modules use type: 'magento2-module'
- 6. Always run setup:upgrade after installing new modules
- 7. dump-autoload regenerates autoloader without updating packages
Interview Tips
- • Explain the difference between composer install and update
- • Know version constraint syntax (^, ~, >=, *)
- • Describe how Magento modules are installed via Composer
- • Understand the autoload section (PSR-4, classmap, files)
- • Know the setup:upgrade and setup:di:compile commands
Cheat Sheet
Composer Cheat Sheet
Commands:
composer install - Install from lock file
composer update - Update packages
composer require pkg:^2 - Add dependency
composer remove pkg - Remove dependency
dump-autoload - Regenerate autoloader
Version Constraints:
^2.0 >=2.0.0 <3.0.0
~2.3 >=2.3.0 <2.4.0
Any version
=2.0 At least 2.0
Magento Module:
{
"type": "magento2-module",
"autoload": {
"psr-4": { "Vendor\\Module\\": "" },
"files": ["registration.php"]
}
}
Post-Install:
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:clean