Deprecation: #94317 - ext:form Finisher implementations

See forge#94317

Description

In preparation of the Extbase ObjectManager deprecation in favor of symfony dependency injection, some details of EXT:form finishers had to be adapted: In contrast to Extbase object management, symfony DI does not support prototype classes with a mixture of manual constructor arguments, plus dependency injection via other constructor arguments or inject methods.

The EXT:form finishers based on TYPO3\CMS\Form\Domain\Finishers\FinisherInterface relied on this and had to be adapted: The default constructor argument $finisherIdentifier has been dropped, so finisher implementations can keep using dependency injection.

Impact

A compatibility layer detects non-adapted finishers and falls back to initialization using Extbase ObjectManager. This will will trigger a PHP E_USER_DEPRECATED error.

Affected Installations

In general only instances with custom form based on EXT:form are affected, and only if they implement custom finishers.

Most custom finishers probably extend TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher. Those are only affected if they override __construct() or use or manipulate properties $finisherIdentifier or $shortFinisherIdentifier in inject*() or injectObject() methods. This is rather unlikely.

Custom finishers that do not extend TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher are affected.

Migration

Custom finishers should extend TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher.

If they must implement __construct(), they should not expect $finisherIdentifier to be hand over as first argument and must not call parent::construct() anymore.

Custom finishers must not rely on $finisherIdentifier or $shortFinisherIdentifier being set in early methods like __construct(), inject*() and injectObject(), and must not set these properties.

Custom finishers must implement method setFinisherIdentifier(), this method will be added to TYPO3\CMS\Form\Domain\Finishers\FinisherInterface in TYPO3 v12.

Custom finishers must not use class property $objectManager since this will vanish in v12. This will affect more API cases and will have a dedicated deprecation file with more details, though.