Creating links between different backend modules in TYPO3 9

I’m working with TYPO3 9 and need help connecting two separate backend modules from different extensions.

I have two extensions, each with its own backend module setup:

First extension module:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
    'MyCompany.firstext',
    'firstext',
    'manager',
    '',
    [
        'ManagerController' => 'listItems',
    ],
    [
        'access' => 'user,group',
        'icon' => '...',
        'labels' => '...',
    ]
);

Second extension module:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
    'MyCompany.secondext',
    'secondext',
    'handler',
    '',
    [
        'HandlerController' => 'showData',
    ],
    [
        'access' => 'user,group',
        'icon' => '...',
        'labels' => '...',
    ]
);

I need to create a link from the first module that opens the second module. I tried these approaches in my FLUID template:

<f:link.action action="showData" controller="HandlerController" extensionName="firstext">Open Second Module</f:link.action>

and also:

<f:be.link route="/secondext/SecondextHandler/">Open Second Module</f:be.link>

Both attempts failed. What’s the proper way to generate these cross-module links? If the be.link approach is correct, how do I determine the right route parameter?

TYPO3 9 cross-module links break because of backend routing config issues. The problem happens when you register modules with different main identifiers (‘firstext’ vs ‘secondext’) - they end up in separate routing contexts that can’t talk to each other properly.

Don’t try fixing this in FLUID templates. Instead, build the URI in your controller using ModuleTemplate API and UriBuilder. For your second module, you’d use the signature ‘secondext_SecondextHandler’, then pass that generated URI to your template as a variable.

Better yet - if these modules need to link to each other regularly, put them under the same main module identifier. It’s cleaner architecture and the routing system handles it way more reliably when modules share a parent context instead of being completely separate.

this is tricky! try using uriBuilder directly in your controller instead of fluid templates. are both modules sharing data or just navigating between them? check if your route names match what you expect - might be a backend routing config issue.

Had the same issue last month. Your route should be /module/secondext/SecondextHandler/ instead of /secondext/SecondextHandler/. Double-check that both extensions loaded correctly. Run bin/typo3 backend:routes to debug and see the actual route names.