Skip to content
beginner Phase 14 · Application Structure

Magento Directory Structure

Magento directory structure overview - app/, vendor/, pub/, var/, generated/. What each directory contains

45m
0 problems
Topic Progress 0%

Top-Level Directory Structure

Root Directory

magento2/
├── app/                    # Custom code, themes, configuration
├── bin/                    # CLI scripts (bin/magento)
├── dev/                    # Development tools and tests
├── lib/                    # Magento framework libraries
├── pub/                    # Web-accessible document root
├── setup/                  # Installation and upgrade scripts
├── var/                    # Cache, logs, temporary files
├── generated/              # Auto-generated code (factories, proxies)
├── vendor/                 # Composer dependencies (Magento core)
├── composer.json           # Composer dependencies
├── composer.lock           # Locked dependency versions
├── Gruntfile.js            # Frontend build tool
├── package.json            # Node.js dependencies
├── magento                 # CLI entry point
└── index.php               # Main entry point

Detailed Directory Breakdown

app/ — Your Custom Code

app/
├── code/                   # Custom modules
│   └── Vendor/
│       └── Module/
│           ├── registration.php
│           ├── etc/
│           ├── Model/
│           ├── Block/
│           └── ...
├── design/                 # Custom themes
│   └── frontend/
│       └── Vendor/
│           └── theme/
└── etc/                    # Global configuration
    ├── config.php          # Module enable/disable
    ├── env.php             # Environment settings (DB, cache)
    └── di.xml              # Global DI configuration

pub/ — Document Root (Web Access)

pub/
├── index.php               # Frontend entry point
├── admin.php               # Admin entry point
├── static/                 # Deployed static files (CSS, JS, images)
│   ├── frontend/
│   └── adminhtml/
├── media/                  # Product images, uploads
├── opt/                    # Optimization (CSS/JS minification)
└── .htaccess               # Apache rewrite rules

vendor/ — Magento Core (DO NOT MODIFY)

vendor/
├── magento/                # All Magento core modules
│   ├── module-catalog/
│   ├── module-sales/
│   ├── module-checkout/
│   └── ...
├── magento/framework/      # Magento Framework
├── composer/               # Composer internals
└── autoload.php            # Composer autoloader

var/ — Temporary Files (Git Ignored)

var/
├── cache/                  # Full-page cache, block cache
├── log/                    # system.log, exception.log, debug.log
├── session/                # PHP session files
├── report/                 # Error reports
├── import/                 # Import/export temp files
├── minification/           # Minified JS/CSS
└── di/                     # Generated DI configuration

generated/ — Auto-Generated Code

generated/
├── code/                   # Generated factories, proxies, interceptors
│   └── Magento/
│       ├── Catalog/
│       │   └── Model/
│       │       ├── ProductFactory.php
│       │       ├── Product\Proxy.php
│       │       └── Product\Interceptor.php
│       └── ...
└── di/                     # Compiled DI config
    └── global.php

Key Configuration Files

app/etc/ Configuration

env.php — Environment Configuration

<?php
return [
    'db' => [
        'table_prefix' => '',
        'default' => [
            'host' => 'localhost',
            'dbname' => 'magento',
            'username' => 'root',
            'password' => '',
            'model' => 'mysql4',
            'engine' => 'innodb',
        ],
    ],
    'cache' => [
        'frontend' => [
            'default' => [
                'backend' => 'Magento\Framework\Cache\Backend\Redis',
                'backend_options' => [
                    'server' => '127.0.0.1',
                    'port' => '6379',
                ],
            ],
        ],
    ],
    'session' => [
        'save' => 'redis',
    ],
    'crypt' => [
        'key' => 'your-encryption-key-here',
    ],
];

config.php — Module Configuration

<?php
return [
    'modules' => [
        'Magento_Catalog' => 1,       // Enabled
        'Magento_Sales' => 1,         // Enabled
        'Vendor_CustomModule' => 1,   // Your module
        'Magento_BundledExtension' => 0, // Disabled
    ],
];

di.xml Files

<!-- app/etc/di.xml — Global DI config -->
<!-- app/code/Vendor/Module/etc/di.xml — Module DI config -->
<!-- app/code/Vendor/Module/etc/frontend/di.xml — Frontend-only DI -->

<config>
    <type name="Vendor\Module\Model\Calculator">
        <arguments>
            <argument name="precision" xsi:type="number">2</argument>
        </arguments>
    </type>
</config>

Other Important Files

File Purpose
app/etc/config.php Module enable/disable
app/etc/env.php DB, cache, encryption settings
composer.json Dependencies, autoloading
bin/magento CLI entry point
pub/index.php Web entry point

Finding Files in Magento

Search Strategies

# Find a module
find app/code vendor/magento -name "module.xml" | grep ModuleName

# Find di.xml files
find . -name "di.xml" -not -path "*/vendor/*"

# Find layout XML
find . -name "*.xml" -path "*/layout/*"

# Find templates
find . -name "*.phtml" -path "*/templates/*"

# Find where a class is defined
grep -r "class ProductRepository" vendor/magento/

# Find plugin definitions
grep -r "plugin name" etc/di.xml

Common File Locations

What Where
Custom module app/code/Vendor/Module/
Custom theme app/design/frontend/Vendor/theme/
DI configuration app/code/Vendor/Module/etc/di.xml
Routes app/code/Vendor/Module/etc/frontend/routes.xml
Layout XML app/code/Vendor/Module/view/frontend/layout/
Templates app/code/Vendor/Module/view/frontend/templates/
Static assets app/code/Vendor/Module/view/frontend/web/
Database setup app/code/Vendor/Module/Setup/
Unit tests app/code/Vendor/Module/Test/Unit/
Integration tests dev/tests/integration/

Autoloading

Magento uses Composer autoloading (PSR-4):

{
    "autoload": {
        "psr-4": {
            "Vendor\\Module\\": "app/code/Vendor/Module/"
        },
        "classmap": [
            "app/code/Vendor/Module/Setup/"
        ]
    }
}

Classes are loaded automatically based on namespace. No manual require needed.

Quiz

1. Where should you put custom modules?

Question 1 options

2. What does the generated/ directory contain?

Question 2 options

3. What is the web-accessible document root?

Question 3 options

Flashcards

Question

Where are custom modules?

Answer

app/code/Vendor/Module/

Question

What is in vendor/?

Answer

Composer dependencies (Magento core) — DO NOT MODIFY

Question

What is pub/?

Answer

Web-accessible document root (index.php, static files, media)

Question

What is generated/?

Answer

Auto-generated factories, proxies, interceptors, compiled DI

Question

What is var/?

Answer

Cache, logs, sessions, temporary files (git ignored)

Revision Notes

Key Takeaways

  • 1. app/code/: Custom modules and themes (your code)
  • 2. vendor/: Magento core via Composer (never modify)
  • 3. pub/: Web document root (index.php, static, media)
  • 4. generated/: Auto-generated factories, proxies, interceptors
  • 5. var/: Cache, logs, sessions (git ignored)
  • 6. Key configs: app/etc/env.php, app/etc/config.php, di.xml

Interview Tips

  • Draw the directory structure and explain each top-level directory
  • Explain why vendor/ should never be modified directly
  • Know where to find specific files (di.xml, routes, templates)

Cheat Sheet

Top-Level:
  app/code/     → Custom modules (YOUR code)
  app/design/   → Custom themes
  vendor/       → Composer deps (DO NOT MODIFY)
  pub/          → Web root (index.php)
  var/          → Cache, logs (git ignored)
  generated/    → Auto-generated code
  bin/magento   → CLI tool

Key Files:
  app/etc/env.php     → DB, cache config
  app/etc/config.php  → Module enable/disable
  etc/di.xml          → Dependency injection
  etc/module.xml      → Module definition