Create a directory structure

Extbase requires or defaults to a certain directory structure. It is considered best practise to always stick to this structure.

On the first level EXT:tea has the following structure:

Directory structure of EXT:tea
$ tree /path/to/extension/tea
├── Classes
├── Configuration
├── Documentation
├── Resources
├── Tests
├── composer.json
├── ext_emconf.php
├── ...

Directory Classes

The folder Classes should contain all PHP classes provided by the extension. Otherwise they are not available in the default autoloading.

See also the general chapter on the folder Classes.

In the composer.json we have defined that all PHP classes are automatically loaded from the Classes directory (and additionally in file:ext_emconf.php for legacy installations):

EXT:tea/composer.json, extract
    "name": "ttn/tea",
    "autoload": {
        "psr-4": {
            "TTN\\Tea\\": "Classes/"
EXT:tea/ext_emconf.php, extract
    'autoload' => [
        'psr-4' => [
            'TTN\\Tea\\' => 'Classes/',

The key of the psr-4 array, here 'TTN\\Tea\\' defines the namespace that all classes in this directory must be situated in to be found by the PSR-4 autoloading.

The folder Classes contains several subfolders:

Directory structure of EXT:tea
$ tree path/to/extension/tea
├── Classes
    ├── Controller
    ├── Domain
    |   ├── Model
    |   └── Repository
    └──  ViewHelpers

Extbase is based on the pattern Model-View-Controller (MVC). And you can already find directories for the model and the controller here.

In most cases the view is handled by classes provided by the framework and configured via templating. Therefore there is no folder for the view as a whole.

Additional logic needed for the view can be provided by ViewHelpers and should be stored in the according folder.

Directory Configuration

See also the general chapter on the folder Configuration.

The folder Configuration contains several subfolders:

Directory structure of EXT:tea
$ tree path/to/extension/tea
├── Configuration
    ├── FlexForms
    ├── TCA
    |   └── Overrides
    ├── TsConfig
    |   ├── Page
    |   └── User
    ├── TypoScript
    |   ├── constants.typoscript
    |   └── setup.typoscript
    └──  Services.yaml
Contains the configuration of additional input fields to configure plugins in the format FlexForm.
Contains the TYPO3 configuration array (TCA) as PHP arrays.
Can be used to extend the TCA of other extensions. They can be extended by direct array manipulation or (preferred if possible) by calls to API functions.
Contains TSconfig configurations for the TYPO3 backend on page or user level in the syntax of TypoScript. This extension does not feature TSconfig, therefore the folder is only a placeholder here.
Contains TypoScript configurations for the frontend. In some contexts the configuration contained here is also considered in the backend.
Is used to configure technical aspects of the extension including automatic wiring, automatic configuration and options for dependency injection. See also Services.yaml.

Directory Documentation

The folder Documentation contains the files from which the documentation is rendered. See Documentation.

Directory Resources

See also the general chapter on the folder Resources.

The folder Resources contains two sub folders that are further divided:

Directory structure of EXT:tea
$ tree /path/to/extension/tea
├── Resources
    ├── Private
    |   ├── Language
    |   ├── Layouts
    |   ├── Partials
    |   └── Templates
    └── Public
        ├── CSS
        ├── Icons
        ├── Images
        └── JavaScript
All resource files that do not have to be loaded directly by a browser should go in this directory. This includes Fluid templating files and localization files.
All resource files have to be loaded directly by a browser must go in this directory. Otherwise they are not accessible depending on the setup of the installation.

Directory Tests

Contains the automatic tests. This topic is not covered by this tutorial.