Skip to content
intermediate Phase 6 · PHP Advanced

Composer: PHP Package Management

Master composer.json, composer.lock, install/update/require, repositories, scripts, and Magento's composer.json.

45m
0 problems
Topic Progress 0%

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?

Question 1 options

2. What does ^2.0 mean in version constraints?

Question 2 options

3. What does composer dump-autoload do?

Question 3 options

4. What is the 'type' field in a Magento module's composer.json?

Question 4 options

5. What must you run after installing a new Magento module?

Question 5 options

Flashcards

Question

What is composer.json?

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?

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?

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?

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?

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?

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?

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?

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