Commit eb0d4528 authored by Benni Mack's avatar Benni Mack Committed by Daniel Goerz
Browse files

[!!!][TASK] Remove various deprecated arguments and methods

This change removes deprecated functionality:

- ReferenceIndex->updateIndex() is now either ProgressListenerInterface or null
- ExtensionManagementUtility->findService() expects an array as third argument
- BasicFileUtility->setFileExtensionPermissions() removed
- GeneralUtility->callUserFunction now expects object or null as third argument
- DataMapper->__construct does not expect $query to be set anymore
- ObjectAccess->setProperty - fourth argument removed

Resolves: #91613
Related: #91473
Releases: master
Change-Id: I39fa30f84201b0ed837f6ac0e6d27e1ddb15376d
parent 25871186
......@@ -1063,29 +1063,14 @@ class ReferenceIndex implements LoggerAwareInterface
* Updating Index (External API)
*
* @param bool $testOnly If set, only a test
* @param bool|ProgressListenerInterface|null $cli_echo If set, output CLI status - but can now be of type ProgressListenerInterface, which should be used instead.
* @param ProgressListenerInterface|null $progressListener If set, the current progress is added to the listener
* @return array Header and body status content
*/
public function updateIndex($testOnly, $cli_echo = null)
public function updateIndex($testOnly, ?ProgressListenerInterface $progressListener = null)
{
$progressListener = null;
if ($cli_echo instanceof ProgressListenerInterface) {
$progressListener = $cli_echo;
$cli_echo = null;
}
if ($cli_echo !== null) {
trigger_error('The second argument of ReferenceIndex->updateIndex() will not work in TYPO3 v11 anymore. Use the ProgressListener to show detailed results', E_USER_DEPRECATED);
} else {
// default value for now
$cli_echo = false;
}
$errors = [];
$tableNames = [];
$recCount = 0;
$headerContent = $testOnly ? 'Reference Index being TESTED (nothing written, remove the "--check" argument)' : 'Reference Index being Updated';
if ($cli_echo) {
echo '*******************************************' . LF . $headerContent . LF . '*******************************************' . LF;
}
// Traverse all tables:
$connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
$refIndexConnectionName = empty($GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']['sys_refindex'])
......@@ -1141,9 +1126,6 @@ class ReferenceIndex implements LoggerAwareInterface
if ($progressListener) {
$progressListener->log($error, LogLevel::WARNING);
}
if ($cli_echo) {
echo $error . LF;
}
}
}
if ($progressListener) {
......@@ -1192,9 +1174,6 @@ class ReferenceIndex implements LoggerAwareInterface
if ($progressListener) {
$progressListener->log($error, LogLevel::WARNING);
}
if ($cli_echo) {
echo $error . LF;
}
if (!$testOnly) {
$queryBuilder = $connectionPool->getQueryBuilderForTable('sys_refindex');
$queryBuilder->delete('sys_refindex')
......@@ -1218,15 +1197,12 @@ class ReferenceIndex implements LoggerAwareInterface
if ($progressListener) {
$progressListener->log($error, LogLevel::WARNING);
}
if ($cli_echo) {
echo $error . LF;
}
if (!$testOnly) {
$this->removeReferenceIndexDataFromUnusedDatabaseTables($tableNames);
}
}
$errorCount = count($errors);
$recordsCheckedString = $recCount . ' records from ' . count($tableNames) . ' tables were checked/updated.' . LF;
$recordsCheckedString = $recCount . ' records from ' . count($tableNames) . ' tables were checked/updated.';
if ($progressListener) {
if ($errorCount) {
$progressListener->log($recordsCheckedString . 'Updates: ' . $errorCount, LogLevel::WARNING);
......@@ -1234,14 +1210,11 @@ class ReferenceIndex implements LoggerAwareInterface
$progressListener->log($recordsCheckedString . 'Index Integrity was perfect!', LogLevel::INFO);
}
}
if ($cli_echo) {
echo $recordsCheckedString . ($errorCount ? 'Updates: ' . $errorCount : 'Index Integrity was perfect!') . LF;
}
if (!$testOnly) {
$registry = GeneralUtility::makeInstance(Registry::class);
$registry->set('core', 'sys_refindex_lastUpdate', $GLOBALS['EXEC_TIME']);
}
return [$headerContent, trim($recordsCheckedString), $errorCount, $errors];
return ['resultText' => trim($recordsCheckedString), 'errors' => $errors];
}
protected function getAmountOfUnusedTablesInReferenceIndex(array $tableNames): int
......
......@@ -1108,19 +1108,15 @@ class ExtensionManagementUtility
*
* @param string $serviceType Service type
* @param string $serviceSubType Service sub type
* @param mixed $excludeServiceKeys Service keys that should be excluded in the search for a service. Array or comma list.
* @param array $excludeServiceKeys Service keys that should be excluded in the search for a service.
* @return mixed Service info array if a service was found, FALSE otherwise
*/
public static function findService($serviceType, $serviceSubType = '', $excludeServiceKeys = [])
public static function findService($serviceType, $serviceSubType = '', array $excludeServiceKeys = [])
{
$serviceKey = false;
$serviceInfo = false;
$priority = 0;
$quality = 0;
if (!is_array($excludeServiceKeys)) {
trigger_error('ExtensionManagementUtility::findService() expects the third method argument to be an array instead of a comma-separated string. TYPO3 v11.0 will only support arrays as third argument for $excludeServiceKeys', E_USER_DEPRECATED);
$excludeServiceKeys = GeneralUtility::trimExplode(',', $excludeServiceKeys, true);
}
if (is_array($GLOBALS['T3_SERVICES'][$serviceType])) {
foreach ($GLOBALS['T3_SERVICES'][$serviceType] as $key => $info) {
if (in_array($key, $excludeServiceKeys)) {
......
......@@ -51,23 +51,6 @@ class BasicFileUtility
*/
public $uniquePrecision = 6;
/**********************************
*
* Checking functions
*
**********************************/
/**
* Sets the file permissions, used in DataHandler e.g.
*
* @param string $allowedFilePermissions
* @param string $deniedFilePermissions
*/
public function setFileExtensionPermissions($allowedFilePermissions, $deniedFilePermissions)
{
trigger_error('BasicFileUtility->setFileExtensionPermissions() serves no purpose anymore. Any usages can be removed, as the FAL API is handling file permissions.', E_USER_DEPRECATED);
}
/**
* Cleans $theDir for slashes in the end of the string and returns the new path, if it exists on the server.
*
......@@ -139,12 +122,6 @@ class BasicFileUtility
return null;
}
/*********************
*
* Cleaning functions
*
*********************/
/**
* Returns a string where any character not matching [.a-zA-Z0-9_-] is substituted by '_'
* Trailing dots are removed
......
......@@ -3060,19 +3060,12 @@ class GeneralUtility
*
* @param string $funcName Function/Method reference or Closure.
* @param mixed $params Parameters to be pass along (typically an array) (REFERENCE!)
* @param mixed $ref Reference to be passed along (typically "$this" - being a reference to the calling object) (REFERENCE!)
* @param object|null $ref Reference to be passed along (typically "$this" - being a reference to the calling object)
* @return mixed Content from method/function call
* @throws \InvalidArgumentException
*/
public static function callUserFunction($funcName, &$params, &$ref = null)
public static function callUserFunction($funcName, &$params, ?object $ref = null)
{
if (!($ref === null || is_object($ref))) {
trigger_error(
sprintf('Argument "$ref" is of type "%s" which is deprecated since TYPO3 10.3. "$ref" must be of type "object" or null as of version 11.0', gettype($ref)),
E_USER_DEPRECATED
);
}
// Check if we're using a closure and invoke it directly.
if (is_object($funcName) && is_a($funcName, \Closure::class)) {
return call_user_func_array($funcName, [&$params, &$ref]);
......@@ -3090,19 +3083,16 @@ class GeneralUtility
// Call method:
$content = call_user_func_array([&$classObj, $parts[1]], [&$params, &$ref]);
} else {
$errorMsg = 'No method name \'' . $parts[1] . '\' in class ' . $parts[0];
throw new \InvalidArgumentException($errorMsg, 1294585865);
throw new \InvalidArgumentException('No method name \'' . $parts[1] . '\' in class ' . $parts[0], 1294585865);
}
} else {
$errorMsg = 'No class named ' . $parts[0];
throw new \InvalidArgumentException($errorMsg, 1294585866);
throw new \InvalidArgumentException('No class named ' . $parts[0], 1294585866);
}
} elseif (function_exists($funcName)) {
// It's a function
$content = call_user_func_array($funcName, [&$params, &$ref]);
} else {
$errorMsg = 'No function named: ' . $funcName;
throw new \InvalidArgumentException($errorMsg, 1294585867);
throw new \InvalidArgumentException('No function named: ' . $funcName, 1294585867);
}
return $content;
}
......
......@@ -78,6 +78,7 @@ The following PHP class methods that have been previously deprecated for v10 hav
- :php:`\TYPO3\CMS\Core\Resource\Index\FileIndexRepository->findBySearchWordInMetaData`
- :php:`\TYPO3\CMS\Core\Resource\ResourceFactory->getInstance`
- :php:`\TYPO3\CMS\Core\Resource\ResourceStorage->checkFileAndFolderNameFilters`
- :php:`\TYPO3\CMS\Core\Utility\BasicFileUtility->setFileExtensionPermissions`
- :php:`\TYPO3\CMS\Extbase\Mvc\Controller\ActionController->emitBeforeCallActionMethodSignal`
- :php:`\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder->setUseCacheHash`
- :php:`\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder->getUseCacheHash`
......@@ -125,11 +126,18 @@ The following PHP methods have been additionally deprecated and are a no-op now:
The following methods changed signature according to previous deprecations in v10 at the end of the argument list:
- :php:`\TYPO3\CMS\Core\Database\ReferenceIndex->updateIndex` (argument 2 is now either null or ProgressListenerInterface, not boolean anymore)
- :php:`\TYPO3\CMS\Core\DataHandling\DataHandler->doesRecordExist` (argument 3 is now an integer)
- :php:`\TYPO3\CMS\Core\DataHandling\DataHandler->recordInfoWithPermissionCheck` (argument 3 is now an integer)
- :php:`\TYPO3\CMS\Core\Localization\LanguageService->includeLLFile` (arguments 2 and 3 are dropped)
- :php:`\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::findService` (arguments 3 :php:`$excludeServiceKeys` is now an array)
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction` (arguments 3 no expects an object or null)
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::getUrl` (arguments 2, 3 and 4 are dropped)
- :php:`\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstanceService` (arguments 3 :php:`$excludeServiceKeys` is now an array)
- :php:`\TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper->__construct` (argument :php:`$query` is removed)
- :php:`\TYPO3\CMS\Extbase\Persistence\Reflection\ObjectAccess->setProperty` (argument :php:`$forceDirectAccess` is removed)
- :php:`\TYPO3\CMS\Extbase\Persistence\Reflection\ObjectAccess->getProperty` (argument :php:`$forceDirectAccess` is removed)
- :php:`\TYPO3\CMS\Extbase\Persistence\Reflection\ObjectAccess->getPropertyInternal` (argument :php:`$forceDirectAccess` is removed)
- :php:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController->__construct`
The following public class properties have been dropped:
......
......@@ -97,7 +97,6 @@ class DataMapper
* @param \TYPO3\CMS\Extbase\Persistence\Generic\QueryFactoryInterface $queryFactory
* @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager
* @param EventDispatcherInterface $eventDispatcher
* @param QueryInterface|null $query
*/
public function __construct(
ReflectionService $reflectionService,
......@@ -106,10 +105,8 @@ class DataMapper
DataMapFactory $dataMapFactory,
QueryFactoryInterface $queryFactory,
ObjectManagerInterface $objectManager,
EventDispatcherInterface $eventDispatcher,
?QueryInterface $query = null
EventDispatcherInterface $eventDispatcher
) {
$this->query = $query;
$this->reflectionService = $reflectionService;
$this->qomFactory = $qomFactory;
$this->persistenceSession = $persistenceSession;
......@@ -117,14 +114,6 @@ class DataMapper
$this->queryFactory = $queryFactory;
$this->objectManager = $objectManager;
$this->eventDispatcher = $eventDispatcher;
if ($query !== null) {
trigger_error(
'Constructor argument $query will be removed in TYPO3 v11.0, use setQuery method instead.',
E_USER_DEPRECATED
);
$this->query = $query;
}
}
/**
......
......@@ -45,7 +45,6 @@ class ObjectAccess
* Get a property of a given object.
* Tries to get the property the following ways:
* - if the target is an array, and has this property, we call it.
* - if super cow powers should be used, fetch value through reflection
* - if public getter method exists, call it.
* - if the target object is an instance of ArrayAccess, it gets the property
* on it if it exists.
......@@ -54,13 +53,12 @@ class ObjectAccess
*
* @param mixed $subject Object or array to get the property from
* @param string $propertyName name of the property to retrieve
* @param bool $forceDirectAccess directly access property using reflection(!)
*
* @throws \InvalidArgumentException in case $subject was not an object or $propertyName was not a string
* @throws Exception\PropertyNotAccessibleException
* @return mixed Value of the property
*/
public static function getProperty($subject, string $propertyName, bool $forceDirectAccess = false)
public static function getProperty($subject, string $propertyName)
{
if (!is_object($subject) && !is_array($subject)) {
throw new \InvalidArgumentException(
......@@ -68,8 +66,7 @@ class ObjectAccess
1237301367
);
}
return self::getPropertyInternal($subject, $propertyName, $forceDirectAccess);
return self::getPropertyInternal($subject, $propertyName);
}
/**
......@@ -81,19 +78,14 @@ class ObjectAccess
*
* @param mixed $subject Object or array to get the property from
* @param string $propertyName name of the property to retrieve
* @param bool $forceDirectAccess directly access property using reflection(!)
*
* @throws Exception\PropertyNotAccessibleException
* @return mixed Value of the property
* @internal
*/
public static function getPropertyInternal($subject, string $propertyName, bool $forceDirectAccess = false)
public static function getPropertyInternal($subject, string $propertyName)
{
if ($forceDirectAccess === true) {
trigger_error('Argument $forceDirectAccess will be removed in TYPO3 11.0', E_USER_DEPRECATED);
}
if (!$forceDirectAccess && ($subject instanceof \SplObjectStorage || $subject instanceof ObjectStorage)) {
if ($subject instanceof \SplObjectStorage || $subject instanceof ObjectStorage) {
$subject = iterator_to_array(clone $subject, false);
}
......@@ -114,7 +106,7 @@ class ObjectAccess
}
if (is_object($subject)) {
return self::getObjectPropertyValue($subject, $propertyPath, $forceDirectAccess);
return self::getObjectPropertyValue($subject, $propertyPath);
}
if (is_array($subject)) {
......@@ -163,18 +155,13 @@ class ObjectAccess
* @param mixed $subject The target object or array
* @param string $propertyName Name of the property to set
* @param mixed $propertyValue Value of the property
* @param bool $forceDirectAccess directly access property using reflection(!)
*
* @throws \InvalidArgumentException in case $object was not an object or $propertyName was not a string
* @return bool TRUE if the property could be set, FALSE otherwise
*/
public static function setProperty(&$subject, string $propertyName, $propertyValue, bool $forceDirectAccess = false): bool
public static function setProperty(&$subject, string $propertyName, $propertyValue): bool
{
if ($forceDirectAccess === true) {
trigger_error('Argument $forceDirectAccess will be removed in TYPO3 11.0', E_USER_DEPRECATED);
}
if (is_array($subject) || ($subject instanceof \ArrayAccess && !$forceDirectAccess)) {
if (is_array($subject) || $subject instanceof \ArrayAccess) {
$subject[$propertyName] = $propertyValue;
return true;
}
......@@ -187,19 +174,6 @@ class ObjectAccess
$accessor->setValue($subject, $propertyName, $propertyValue);
return true;
}
if ($forceDirectAccess) {
if (property_exists($subject, $propertyName)) {
$propertyReflection = new \ReflectionProperty($subject, $propertyName);
$propertyReflection->setAccessible(true);
$propertyReflection->setValue($subject, $propertyValue);
} else {
$subject->{$propertyName} = $propertyValue;
}
return true;
}
return false;
}
......@@ -379,12 +353,10 @@ class ObjectAccess
/**
* @param object $subject
* @param PropertyPath $propertyPath
* @param bool $forceDirectAccess
* @return mixed
* @throws Exception\PropertyNotAccessibleException
* @throws \ReflectionException
*/
private static function getObjectPropertyValue(object $subject, PropertyPath $propertyPath, bool $forceDirectAccess)
private static function getObjectPropertyValue(object $subject, PropertyPath $propertyPath)
{
$accessor = self::createAccessor();
......@@ -392,19 +364,7 @@ class ObjectAccess
return $accessor->getValue($subject, $propertyPath);
}
$propertyName = (string)$propertyPath;
if (!$forceDirectAccess) {
throw new PropertyNotAccessibleException('The property "' . $propertyName . '" on the subject does not exist.', 1476109666);
}
if (!property_exists($subject, $propertyName)) {
throw new PropertyNotAccessibleException('The property "' . $propertyName . '" on the subject does not exist.', 1302855001);
}
$propertyReflection = new \ReflectionProperty($subject, $propertyName);
$propertyReflection->setAccessible(true);
return $propertyReflection->getValue($subject);
throw new PropertyNotAccessibleException('The property "' . (string)$propertyPath . '" on the subject does not exist.', 1476109666);
}
/**
......
......@@ -37,8 +37,6 @@ services:
TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper:
shared: false
arguments:
$query: null
cache.extbase:
class: TYPO3\CMS\Core\Cache\Frontend\FrontendInterface
......
......@@ -1200,7 +1200,7 @@ class QueryLocalizedDataTest extends FunctionalTestCase
}
/**
* This is a copy of the ObjectAccess::getPropertyPath, but with third argument of getPropertyInternal set as true,
* This is a copy of the ObjectAccess::getPropertyPath, but with the fallback
* to access protected properties, and iterator_to_array added.
*
* @param mixed $subject Object or array to get the property path from
......@@ -1213,13 +1213,16 @@ class QueryLocalizedDataTest extends FunctionalTestCase
$propertyPathSegments = explode('.', $propertyPath);
try {
foreach ($propertyPathSegments as $pathSegment) {
$subject = ObjectAccess::getPropertyInternal($subject, $pathSegment, true);
$subject = ObjectAccess::getPropertyInternal($subject, $pathSegment);
if ($subject instanceof \SplObjectStorage || $subject instanceof ObjectStorage) {
$subject = iterator_to_array(clone $subject, false);
}
}
} catch (PropertyNotAccessibleException $error) {
return null;
// Workaround for this test
$propertyReflection = new \ReflectionProperty($subject, $pathSegment);
$propertyReflection->setAccessible(true);
return $propertyReflection->getValue($subject);
}
return $subject;
}
......
<?php
declare(strict_types=1);
/*
* This file is part of the TYPO3 CMS project.
*
* It is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, either version 2
* of the License, or any later version.
*
* For the full copyright and license information, please read the
* LICENSE.txt file that was distributed with this source code.
*
* The TYPO3 project - inspiring people to share!
*/
namespace TYPO3\CMS\Extbase\Tests\UnitDeprecated\Reflection;
use TYPO3\CMS\Extbase\Reflection\Exception\PropertyNotAccessibleException;
use TYPO3\CMS\Extbase\Reflection\ObjectAccess;
use TYPO3\CMS\Extbase\Tests\Unit\Reflection\Fixture\DummyClassWithGettersAndSetters;
use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
/**
* Test case
*/
class ObjectAccessTest extends UnitTestCase
{
/**
* @var bool Reset singletons created by subject
*/
protected $resetSingletonInstances = true;
/**
* @var DummyClassWithGettersAndSetters
*/
protected $dummyObject;
/**
* Set up
*/
protected function setUp(): void
{
parent::setUp();
$this->dummyObject = new DummyClassWithGettersAndSetters();
$this->dummyObject->setProperty('string1');
$this->dummyObject->setAnotherProperty(42);
$this->dummyObject->shouldNotBePickedUp = true;
}
/**
* @test
*/
public function getPropertyReturnsExpectedValueForUnexposedPropertyIfForceDirectAccessIsTrue()
{
$property = ObjectAccess::getProperty($this->dummyObject, 'unexposedProperty', true);
self::assertEquals($property, 'unexposed', 'A property of a given object was not returned correctly.');
}
/**
* @test
*/
public function getPropertyReturnsExpectedValueForUnknownPropertyIfForceDirectAccessIsTrue()
{
$this->dummyObject->unknownProperty = 'unknown';
$property = ObjectAccess::getProperty($this->dummyObject, 'unknownProperty', true);
self::assertEquals($property, 'unknown', 'A property of a given object was not returned correctly.');
}
/**
* @test
*/
public function getPropertyThrowsPropertyNotAccessibleExceptionForNotExistingPropertyIfForceDirectAccessIsTrue()
{
$this->expectException(PropertyNotAccessibleException::class);
$this->expectExceptionCode(1302855001);
ObjectAccess::getProperty($this->dummyObject, 'notExistingProperty', true);
}
}
......@@ -784,7 +784,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
} else {
$userGroups = [0, -2];
}
$this->context->setAspect('frontend.user', GeneralUtility::makeInstance(UserAspect::class, $this->fe_user ?: null, $userGroups));
$this->context->setAspect('frontend.user', GeneralUtility::makeInstance(UserAspect::class, $this->fe_user, $userGroups));
// Fetching the id again, now with the preview settings reset.
$this->fetch_the_id($request);
}
......
......@@ -70,7 +70,7 @@ class ReferenceIndexUpdatedPrerequisite implements PrerequisiteInterface, Chatty
$progressListener->initialize(new SymfonyStyle(new ArrayInput([]), $this->output));
$this->referenceIndex->enableRuntimeCache();
$result = $this->referenceIndex->updateIndex(false, $progressListener);
return count($result[3]) === 0;
return empty($result['errors']);
}
/**
......@@ -82,7 +82,7 @@ class ReferenceIndexUpdatedPrerequisite implements PrerequisiteInterface, Chatty
{
$this->referenceIndex->enableRuntimeCache();
$result = $this->referenceIndex->updateIndex(true);
return count($result[3]) === 0;
return empty($result['errors']);
}
/**
......
......@@ -35,6 +35,7 @@ return [
'restFiles' => [
'Breaking-87305-UseConstructorInjectionInDataMapper.rst',
'Deprecation-87305-UseConstructorInjectionInDataMapper.rst',
'Breaking-91473-DeprecatedFunctionalityRemoved.rst'
],
]
],
......
......@@ -52,18 +52,21 @@ return [
'maximumNumberOfArguments' => 2,
'restFiles' => [
'Deprecation-87332-AvoidRuntimeReflectionCallsInObjectAccess.rst',
'Breaking-91473-DeprecatedFunctionalityRemoved.rst'
],
],
'TYPO3\CMS\Extbase\Reflection\ObjectAccess::getPropertyInternal' => [
'maximumNumberOfArguments' => 2,
'restFiles' => [
'Deprecation-87332-AvoidRuntimeReflectionCallsInObjectAccess.rst',
'Breaking-91473-DeprecatedFunctionalityRemoved.rst'
],
],
'TYPO3\CMS\Extbase\Reflection\ObjectAccess::setProperty' => [
'maximumNumberOfArguments' => 3,
'restFiles' => [
'Deprecation-87332-AvoidRuntimeReflectionCallsInObjectAccess.rst',
'Breaking-91473-DeprecatedFunctionalityRemoved.rst'
],
],
'TYPO3\CMS\Core\Utility\GeneralUtility::getUrl' => [
......
......@@ -4416,6 +4416,7 @@ return [
'maximumNumberOfArguments' => 2,
'restFiles' => [
'Important-90020-LegacyBasicFileUtilityAndExtendedFileUtilityClassesMarkedAsInternal.rst',
'Breaking-91473-DeprecatedFunctionalityRemoved.rst'
],
],
'TYPO3\CMS\Extbase\Mvc\Controller\ActionController->emitBeforeCallActionMethodSignal' => [
......
......@@ -303,7 +303,9 @@ class DatabaseIntegrityController
$testOnly = (bool)GeneralUtility::_GP('_check');
$refIndexObj = GeneralUtility::makeInstance(ReferenceIndex::class);