---
title: "Create a backend module with Extbase"
manual: "TYPO3 Explained"
version: "12.4"
permalink: "https://docs.typo3.org/permalink/t3coreapi:backend-modules-template@12.4"
source: "ExtensionArchitecture/HowTo/BackendModule/CreateModuleWithExtbase.rst"
rendered: "2026-10-21T15:29:37+00:00"
---

<a id="backend-modules-extbase"></a>

# Create a backend module with Extbase {#backend-modules-template}

> [!TIP]
> If you don't want to do extensive data modeling templates can be written
> [without Extbase.](https://docs.typo3.org/permalink/t3coreapi:backend-modules-template-without-extbase@12.4)

See also the [Backend module API](https://docs.typo3.org/permalink/t3coreapi:backend-modules@12.4).

Backend modules can be written using the Extbase/Fluid combination.

The factory `\TYPO3\CMS\Backend\Template\ModuleTemplateFactory` can be used
to retrieve the `\TYPO3\CMS\Backend\Template\ModuleTemplate`
class which is - more or less - the old backend module template,
cleaned up and refreshed. This class performs a number of basic
operations for backend modules, like loading base JS libraries,
loading stylesheets, managing a flash message queue and - in general -
performing all kind of necessary setups.

To access these resources, inject the
`\TYPO3\CMS\Backend\Template\ModuleTemplateFactory` into your backend module
controller:

```php
 use TYPO3\CMS\Backend\Attribute\AsController;
 use TYPO3\CMS\Backend\Template\ModuleTemplateFactory;
 use TYPO3\CMS\Extbase\Mvc\Controller\ActionController;

 #[AsController]
 final class MyController extends ActionController
 {
     public function __construct(
         protected readonly ModuleTemplateFactory $moduleTemplateFactory,
     ) {
     }
}
```

<!-- TODO: no Markdown rendering for "versionadded" -->

A backend controller can be tagged with the
\TYPO3\CMS\Backend\Attribute\AsController attribute. This way, the
registration of the controller
in the Configuration/Services.yaml file is no longer necessary.Until TYPO3 v12.4.8 the attribute was named
\TYPO3\CMS\Backend\Attribute\Controller and has been renamed to
AsController with TYPO3 v12.4.9. Both work with TYPO3 v12 and v13,
but developers should use #[AsController] for upwards compatibility,
since #[Controller] has been deprecated with TYPO3 v13.

After that you can add titles, menus and buttons using `ModuleTemplate`:

```php
// use Psr\Http\Message\ResponseInterface
public function myAction(): ResponseInterface
{
    $this->view->assign('someVar', 'someContent');
    $moduleTemplate = $this->moduleTemplateFactory->create($this->request);

    // Example of adding a page-shortcut button
    $routeIdentifier = 'web_examples'; // array-key of the module-configuration
    $buttonBar = $moduleTemplate->getDocHeaderComponent()->getButtonBar();
    $shortcutButton = $buttonBar->makeShortcutButton()->setDisplayName('Shortcut to my action')->setRouteIdentifier($routeIdentifier);
    $shortcutButton->setArguments(['controller' => 'MyController', 'action' => 'my']);
    $buttonBar->addButton($shortcutButton, ButtonBar::BUTTON_POSITION_RIGHT);
    // Adding title, menus and more buttons using $moduleTemplate ...

    $moduleTemplate->setContent($this->view->render());
    return $this->htmlResponse($moduleTemplate->renderContent());
}
```

> [!NOTE]
> **See also**
>
> [Dropdown button components](https://docs.typo3.org/permalink/t3coreapi:dropdown-button-components@12.4)

Using this `ModuleTemplate` class, the Fluid templates for
your module need only take care of the actual content of your module.
TYPO3 even comes with a default Fluid layout, that can easily be used:

```html
<f:layout name="Module" />
```

and the actual Template needs to render the title and the content only.
For example, here is an extract of the "Index" action template of
the "beuser" extension:

**typo3/sysext/beuser/Resources/Private/Templates/BackendUser/List.html**

```html
<html
   xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
   xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
   xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
   data-namespace-typo3-fluid="true">

   <f:layout name="Module" />

   <f:section name="Content">
       <h1><f:translate key="backendUserListing" /></h1>
       ...
   </f:section>

</html>
```

The best resources for learning is to look at existing modules
from TYPO3 CMS. With the information given here, you should be
able to find your way around the code.
