Skip to content

executeFrontendSubRequest() clear my loaded plugin action in $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'] #688

@Apen

Description

@Apen

What are you trying to achieve?

Use executeFrontendSubRequest() to test some plugin rendering.

How to reproduce the issue?

I my extension, i execute some tests and i load some extension like this

protected array $testExtensionsToLoad = [
        'sng/sngpackage',
        __DIR__ . '/../Fixtures/Extensions/sngpackagedemo',
    ];

My plugin in "sngpackagedemo" is correctly initialized, and in my test class, i can check that $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'] contain the description of my plugin and action.

If i use executeFrontendSubRequest() , i have an error like InvalidArgumentException: The default controller for extension "Sngpackagedemo" and plugin "xxx" can not be determined. Please check for TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin() in your ext_localconf.php.

After some research i find the problem in this function and its when bootstrapping in :

$container = Bootstrap::init(ClassLoadingInformation::getClassLoader());

If i debug before init() my extension is in $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'].
If i debug after, i lose my plugin description in $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'].

If i do something like this in the code :

$save = $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'];
$container = Bootstrap::init(ClassLoadingInformation::getClassLoader());
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['extbase']['extensions'] = $save;

Everything is working. This is ugly, but its only for testing purpose.

Another thing i test is forcing the declaration :

protected array $configurationToUseInTestInstance = [
        'FE' => [
            'cacheHash' => [
                'enforceValidation' => false,
            ],
        ],
        'EXTCONF' => [
            'extbase' => [
                'extensions' => [
                    'Sngpackagedemo' => [
                        'plugins' => [
                            'Displayusers' => [
                                'controllers' => [
                                    'Sng\Sngpackagedemo\Controller\FrontendUserController' => [
                                        'className' => 'Sng\Sngpackagedemo\Controller\FrontendUserController',
                                        'alias' => 'FrontendUser',
                                        'actions' => [
                                            'list',
                                        ],
                                        'nonCacheableActions' => [
                                            'list',
                                        ],
                                    ],
                                ],
                                'pluginType' => 'CType',
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ];

With this code it works perfectly. But it seems strange to me :-)

Is there anything i miss? Why the new Bootstrap::init() doesn't read or execute the configurePlugin() in my custom extension ? I debug the code and everything are loaded in this request.

Additional information you would like to provide?

Composer
PHP : 8.4
TYPO3 : 13.4.19
typo3/testing-framework : 9.2.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions