Feature: #107047 - FlexForm enhancements: Direct plugin registration and raw TCA support
See forge#107047
FlexForm Direct Plugin Registration
The methods 
        \TYPO3\
and 
        \TYPO3\
have been extended to accept a FlexForm definition directly via an additional
        $flex argument.
This new argument allows extensions to provide the FlexForm data structure when registering a plugin.
The FlexForm can either be a reference to a FlexForm XML file
(e.g., FILE:) or the XML content itself.
This simplifies the configuration and avoids the need to define the FlexForm separately in TCA.
Examples
Direct FlexForm Plugin Registration
ExtensionUtility::registerPlugin(
    'MyExtension',
    'MyPlugin',
    'My Plugin Title',
    'my-extension-icon',
    'plugins',
    'Plugin description',
    'FILE:EXT:myext/Configuration/FlexForm.xml'
);Alternatively, using 
        add when not using Extbase:
ExtensionManagementUtility::addPlugin(
    [
        'My Plugin Title',
        'my_plugin',
        'my-extension-icon'
    ],
    'FILE:EXT:myext/Configuration/FlexForm.xml'
);Internally, this adds the FlexForm definition to the ds option of the plugin
via the columns configuration and also adds the pi_ field
to the showitem list. For more information on this, check Breaking: #107047 - Remove pointer field functionality of TCA flex,
which describes the migration of the ds option from multi-entry to single-entry.
FlexFormTools Schema Parameter Requirement
The 
        Flex service has been fundamentally changed to eliminate
its previous dependency on 
        $GLOBALS, which caused architectural
issues.
The following methods now support an explicit 
        $schema parameter
that accepts either a TcaSchema object or raw TCA configuration array:
- get- Data - Structure - Identifier - () 
- parse- Data - Structure - By - Identifier - () 
- clean- Flex - Form - XML - () 
Previously, these methods had no schema parameter and relied on
        $GLOBALS internally, which was problematic for schema
building processes.
Calling code must now explicitly provide the schema data, either as:
- A resolved TcaSchema object (for normal application usage)
- A raw TCA configuration array (for schema building contexts)
This architectural improvement eliminates circular dependencies and allows
        Flex to be used during schema building processes where TCA
Schema objects are not yet available, resolving issues in components like the
        Relation.
FlexFormTools with TCA Schema
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
// Using TCA Schema object
$tcaSchema = $tcaSchemaFactory->get('tt_content');
$identifier = $flexFormTools->getDataStructureIdentifier(
    $fieldTca,
    'tt_content',
    'pi_flexform',
    $row,
    $tcaSchema
);FlexFormTools with raw TCA array
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
// Using raw TCA configuration array
$rawTca = $fullTca['tt_content'];
$identifier = $flexFormTools->getDataStructureIdentifier(
    $fieldTca,
    'tt_content',
    'pi_flexform',
    $row,
    $rawTca
);Schema building context
// In RelationMapBuilder - previously not possible
$flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
foreach ($tca as $table => $tableConfig) {
    foreach ($tableConfig['columns'] ?? [] as $fieldName => $fieldConfig) {
        if ($fieldConfig['config']['type'] === 'flex') {
            // Can now use raw TCA during schema building
            $dataStructure = $flexFormTools->parseDataStructureByIdentifier(
                $identifier,
                $tableConfig  // Raw TCA array
            );
        }
    }
}Impact
Direct FlexForm Plugin Registration
This change allows simplifying configuration of plugins and corresponding
FlexForms, since they can directly be added on registration. This makes
e.g. the usual Extension call superfluous.
Therefore this method has been deprecated, see:
Deprecation: #107047 - ExtensionManagementUtility::addPiFlexFormValue().
FlexFormTools Schema support
The service now automatically detects the input type and uses the appropriate
resolution strategy for both TCA Schema objects and raw TCA arrays. It does
no longer rely on 
        $GLOBALS. This allows to directly influence
the service. It furthermore allows usage during schema building where no
TCA Schema is available.
Technical Details
The service uses PHP's union types (
        array) and automatically
routes to the appropriate internal methods. Both input types produce identical
normalized output, ensuring that consumers of the 
        Flex service
receive consistent data structures regardless of the used input type.