Create a directory structure

Extbase requires a particular directory structure. It is considered best practice 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 Classes/ folder should contain all the PHP classes provided by the extension. Otherwise they will not be available in the default autoloading. (See documentation on the Classes folder).

In the composer.json we define that all PHP classes are automatically loaded from the Classes/ directory (also defined in file:ext_emconf.php in 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 for all classes in order to be found by PSR-4 autoloading.

The Classes/ folder contains 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) so we have model and controller directories.

In most cases the view is handled by classes provided by the framework and configured via templating. Therefore a view folder is not required.

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

Directory Configuration

See also documentation on the Configuration folder.

The Configuration folder 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 using the FlexForm format.
Contains the TYPO3 configuration array (TCA) (PHP arrays).
Can be used to extend the TCA of other extensions. They can be extended by direct array manipulation or preferably by calls to API functions.
Contains TSconfig configuration for the TYPO3 backend on page or user level in TypoScript syntax. Our extension does not contain TSconfig, so the folder is only a placeholder here.
Contains TypoScript configuration for the frontend. In some contexts the configuration contained here is also used 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 Documentation/ folder contains files from which documentation is rendered. See Documentation.

Directory Resources/

See also documentation on the Resources folder.

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

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 are not directly loaded by the browser should go in this directory. This includes Fluid templating files and localization files.
All resource files that are directly loaded by the browser must go in this directory. Otherwise they are not accessible (depending on the setup of the installation).

Directory Tests/

Contains automatic tests (topic not covered by this tutorial).