TYPO3 v8 has reached its end-of-life March 31st, 2020 and is not maintained by the community anymore. Looking for a stable version? Use the version switch on the top left.

You can order Extended Long Term Support (ELTS) here: TYPO3 ELTS.

Create Folder Structure And Configuration Files

Before we write the first line of code, we must arrange the infrastructure of the extension. Beside the folder structure there are some minimum needed configuration files counting. We put the unique identifier of our extension (extension-key) as store_inventory, and thus we specify at the same time the name of the extension as Store Inventory.


The name of an extension is always written in UpperCamelCase (beginning with a capital letter, then upper and lower letters; no underscore), while the extension key may only contain small letters and underscore (lower_underscore). You will find an overview of the name conventions in appendix A, Coding Guidelines.

Extensions can be stored at different places in TYPO3. Locally installed extensions are the rule. These are in the folder typo3conf/ext/. System extensions are delivered with the TYPO3-distribution and are in the folder typo3/sysext/. Extbase or Fluid are examples of system extensions. The two paths are below the installation folder of TYPO3, in which also lies the file index.php.

Then, in the folder for local extensions typo3conf/ext/ we create the folder store_inventory. The name of this folder must be written like the extension key and therefore in lower-case letters, and where appropriate, with underscores. On the uppermost level lie the folders Classes and Resources. The folder Classes contains all PHP classes, with the exception of external PHP libraries. The folder Resources contains two directories named Private and Public. The folder Resources/Private/ contains subfolders like Templates, Layouts, Partials and Language. These files can only be accessed through the file system. The folder Resources/Public/ contains subfolders like Icons, Css, Js. These files can be accessed through the web browser. Within the folder Classes are the folders Controller and Domain. In our example, the folder Controller contains only one class that will control the entire process of listing creation later. The folder Domain again contains the two folders Model and Repository. Resulting from all this, the folder structure within the extension folder store_inventory should look as in image 4-1.


Figure 4-1: The standard directory structure with the important files for the extension manager

A single configuration file named ext_emconf.php is required by TYPO3 to allow for loading the extension. The file is located in the extension's top level folder (store_inventory/). You can copy and adapt this file from an existing extension. Later on it is advisable to have it generated by the Extension Builder.

The file ext_emconf.php contains the meta information for the extension like title, description, status, name of the author and more. It is not special in any way and does not differ from the one of any other extension. Find a complete reference in chapter Declaration file of the Core Api Reference manual.


    'title' => 'Store Inventory',
    'description' => 'An extension to manage a stock.',
    'category' => 'plugin',
    'author' => 'John Doe',
    'author_company' => 'John Doe Inc.',
    'author_email' => '',
    'state' => 'alpha',
    'clearCacheOnLoad' => true,
    'version' => '0.0.0',
    'constraints' => [
        'depends' => [
            'typo3' => '8.7.0-8.9.99',
    'autoload' => [
        'psr-4' => [
            'MyVendor\\StoreInventory\\' => 'Classes'

In previous versions of TYPO3 the extension icon was named ext_icon.gif. Starting with TYPO3 8 you can choose between PNG or SVG format. The file must have the name Extension.png or Extension.svg and must be stored in the directory Resources/Public/Icons/. The icon will be displayed in the extension manager and in the TYPO3 extension repository (TER).

If the extension has namespaced classes following the PSR-4 standard, then you can add the autoload array to your ext_emconf.php file.

After the basic structure was constructed, the extension can already be shown in the extension manager and can be installed. But first we turn to our domain.