.. include:: /Includes.rst.txt

.. _breaking-92238:

==========================================================
Breaking: #92238 - Service injection in Extbase validators
==========================================================

See :issue:`92238`

Description
===========

With the deprecation and removal of objectManager usage in TYPO3, Extbase does not
use the objectManager to create validator instances any more.

.. note::

    This has been mitigated with recent TYPO3 v11 core releases: Extbase validators
    can use dependency injection again. See :doc:`this changelog <../11.5.x/Important-96332-ExtbaseValidatorsCanUseDependencyInjection>`
    for details.
    Additionally, all validators delivered by EXT:extbase and EXT:form will be marked
    :php:`final` in v12. Extensions can no longer extend validators but must extend abstract
    classes or implement the interfaces directly.

Impact
======

Validators that use dependency injection will experience non injected services for affected properties.


Affected Installations
======================

All installations that use dependency injection in Extbase validators.


Migration
=========


Instead of injecting services to the validator, use :php:`GeneralUtility::makeInstance`
to create an instance of required services.

Given the following example for a service injection in a validator:

.. code-block:: php

    /**
     * @var ConfigurationManagerInterface
     */
    protected $configurationManager;

    /**
     * @param ConfigurationManagerInterface $configurationManager
     */
    public function injectConfigurationManager(ConfigurationManagerInterface $configurationManager)
    {
        $this->configurationManager = $configurationManager;
    }

Since the configurationManager is required globally in the class, :php:`GeneralUtility::makeInstance`
is used in the constructor of the validator to create an instance of the service.

.. code-block:: php

    /**
     * @var ConfigurationManagerInterface
     */
    protected $configurationManager;

    public function __construct(array $options = [])
    {
        $this->configurationManager = GeneralUtility::makeInstance(ConfigurationManagerInterface::class);
        parent::__construct($options);
    }

In order to create instances of services that require dependency injection and which
are not already instantiated in the service container, it is required to declare those
services as :php:`public: true` in the :php:`Configuration/Services.yaml` of the given extension.

.. code-block:: yaml

    Vendor\MyExtension\Services\MyService:
      public: true


.. index:: PHP-API, NotScanned, ext:extbase
