---
title: "Registration of frontend plugins"
manual: "TYPO3 Explained"
version: "12.4"
permalink: "https://docs.typo3.org/permalink/t3coreapi:extbase-registration-of-frontend-plugins@12.4"
source: "ExtensionArchitecture/Extbase/Reference/FrontendPlugins.rst"
rendered: "2026-10-21T15:29:37+00:00"
---

> [!WARNING]
> **Attention**
>
> TYPO3 v12 has reached end-of-life as of April 30th 2026 and
> is no longer being maintained. Use the version switcher on the top
> left of this page to select documentation for a supported version of TYPO3.
>
> Need more time before upgrading?
> You can purchase Extended Long Term Support (ELTS) for TYPO3 v12 here:
> [TYPO3 ELTS](https://typo3.com/services/extended-support-elts).

# Registration of frontend plugins {#extbase-registration-of-frontend-plugins}

When you want to use Extbase controllers in the frontend you need to define a
so called [frontend plugin](https://docs.typo3.org/permalink/t3coreapi:frontend-plugin@12.4).
Extbase allows to define multiple frontend plugins
for different use cases within one extension.

A frontend plugin can be defined as
[content element](https://docs.typo3.org/permalink/t3coreapi:extbase-frontend-plugin-content-element@12.4) or as pure
[TypoScript frontend plugin](https://docs.typo3.org/permalink/t3coreapi:extbase-frontend-plugin-typoscript@12.4).

Content element plugins can be added by editors to pages in the **Page**
module while TypoScript frontend plugin can only be added via TypoScript or
Fluid in a predefined position of the page. All content element plugins can
also be used as TypoScript plugin.

## Frontend plugin as content element {#extbase-frontend-plugin-content-element}

![](../../../Images/ManualScreenshots/Extbase/NewPlugin.png)

Use the following steps to add the plugin as content element:

1.  `configurePlugin()`: Make the plugin available in the frontend

    **EXT:blog_example/ext_localconf.php**

    ```php
    <?php

    declare(strict_types=1);

    use FriendsOfTYPO3\BlogExample\Controller\CommentController;
    use FriendsOfTYPO3\BlogExample\Controller\PostController;
    use TYPO3\CMS\Extbase\Utility\ExtensionUtility;

    defined('TYPO3') or die();

    ExtensionUtility::configurePlugin(
        // extension name, matching the PHP namespaces (but without the vendor)
        'BlogExample',
        // arbitrary, but unique plugin name (not visible in the backend)
        'PostSingle',
        // all actions
        [PostController::class => 'show', CommentController::class => 'create'],
        // non-cacheable actions
        [CommentController::class => 'create'],
    );

    ```

    Use the following parameters:

    1.  Extension key `'blog_example'` or name `BlogExample`.
    1.  A unique identifier for your plugin in UpperCamelCase: `'PostSingle'`
    1.  An array of allowed combinations of controllers and actions stored in an array
    1.  (Optional) an array of controller name and  action names which should not be cached

    `\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin()` generates
    the necessary TypoScript to display the plugin in the frontend.

    In the above example the actions `show` in the `PostController` and
    `create` in the `CommentController` are allowed. The later action
    should not be cached. This action can show different output depending on
    whether a comment was just added, there was an error in the input etc.
    Therefore the output of the action `create` of the `CommentController`
    should not be cached.

    The action `delete` of the `CommentController` is not listed. This
    action is therefore not allowed in this plugin.

    The TypoScript of the plugin will be available at
    `tt_content.list.20.blogexample_postsingle`. Additionally
    the lists of allowed and non-cacheable actions have been added to the
    according global variables.
1.  `registerPlugin()`: Add to `list_type` `tt_content`.

    Make the plugin available in the field
    **Plugin > Selected Plugin**, `list_type` of the table
    `tt_content`.

    ![](../../../Images/ManualScreenshots/Extbase/ListType.png)

    The new plugin in the content record at **Plugin > Selected Plugin**

    **EXT:blog_example/Configuration/TCA/Overrides/tt_content.php**

    ```php
    <?php

    defined('TYPO3') or die();

    (static function (): void {
        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerPlugin(
            // extension name, matching the PHP namespaces (but without the vendor)
            'BlogExample',
            // arbitrary, but unique plugin name (not visible in the backend)
            'PostSingle',
            // plugin title, as visible in the drop-down in the backend, use "LLL:" for localization
            'Single Post (BlogExample)',
        );
    })();

    ```

    Use the following parameters:

    1.  Extension key `'blog_example'` or name `BlogExample`.
    1.  A unique identifier for your plugin in UpperCamelCase: `'PostSingle'`,
        must be the same as used in `configurePlugin()` or the plugin will
        not render.
    1.  Plugin title in the backend: Can be a string or a localized string starting
        with `LLL:`.
    1.  (Optional) the [icon identifier](https://docs.typo3.org/permalink/t3coreapi:icon@12.4) or file path prepended with "EXT:"
1.  (Optional) Add to the **New Content Element** wizard

    Add the following [page TSconfig](https://docs.typo3.org/m/typo3/reference-typoscript/12.4/en-us/UsingSettingTSconfig/PageTSconfig.html#setting-page-tsconfig)
    to add the new plugin to the wizard:

    **EXT:blog_example/Configuration/page.tsconfig**

    ```typoscript
    mod.wizards.newContentElement.wizardItems {
      // add the content elementS to the tab "plugins"
      plugins {
        elements {
          // ...
          blogexample_postsingle {
            iconIdentifier = blog_example_icon
            title = PostSingle
            description = Display a single blog post
            tt_content_defValues {
              CType = list
              list_type = = blogexample_postsingle
            }
          }
        }

        show := addToList(blogexample_postlist,blogexample_postsingle,blogexample_blogadmin)
      }
    }

    ```

    -   Line 6: The plugin signature: The extension name in lowercase without
        underscores, followed by one underscore, followed by the plugin identifier
        in lowercase without underscores.
    -   Line 7: Should be the same icon like used in `registerPlugin()` for consistency
    -   Line 8: Should be the same title like used in `registerPlugin()` for consistency
    -   Line 9: Additional description:  Can be a string or a localized string starting
        with `LLL:`.
    -   Line 12: The plugin signature as `list_type`
    -   Line 16: Add the plugin signature as to the list of allowed content elements

    In TYPO3 v11 you still need to include the page TSconfig file, in TYPO3 v12
    it is automatically globally included.

    See [Setting the page TSconfig globally](https://docs.typo3.org/m/typo3/reference-typoscript/12.4/en-us/UsingSettingTSconfig/PageTSconfig.html#pagesettingdefaultpagetsconfig).

## Frontend plugin as pure TypoScript {#extbase-frontend-plugin-typoscript}

1.  `configurePlugin()`: Make the plugin available in the frontend

    Configure the plugin just like described in
    [Frontend plugin as content element](https://docs.typo3.org/permalink/t3coreapi:extbase-frontend-plugin-content-element@12.4). This will create the
    basic TypoScript and the lists of allowed controller-action combinations.

    In this example we define a plugin displaying a list of posts as RSS feed:

    **EXT:blog_example/ext_localconf.php**

    ```php
    <?php

    declare(strict_types=1);

    use FriendsOfTYPO3\BlogExample\Controller\PostController;
    use TYPO3\CMS\Extbase\Utility\ExtensionUtility;

    defined('TYPO3') or die();

    // RSS feed
    ExtensionUtility::configurePlugin(
        'BlogExample',
        'PostListRss',
        [PostController::class => 'displayRssList'],
    );

    ```
1.  Display the plugin via TypoScript

    The TypoScript [USER](https://docs.typo3.org/m/typo3/reference-typoscript/12.4/en-us/ContentObjects/UserAndUserInt/Index.html#cobj-user) object saved at
    `tt_content.list.20.blogexample_postlistrss` can now be used
    to display the frontend plugin. In this example we create a special page type
    for the RSS feed and display the plugin via TypoScript there:

    **EXT:blog_example/Configuration/TypoScript/RssFeed/setup.typoscript**

    ```typoscript
    # RSS rendering
    tx_blogexample_rss = PAGE
    tx_blogexample_rss {
      typeNum = {$plugin.tx_blogexample.settings.rssPageType}
      10 < tt_content.list.20.blogexample_postlistrss

      config {
        disableAllHeaderCode = 1
        xhtml_cleaning = none
        admPanel = 0
        debug = 0
        disablePrefixComment = 1
        metaCharset = utf-8
        additionalHeaders.10.header = Content-Type:application/rss+xml;charset=utf-8
        linkVars >
      }
    }

    ```
