Breaking: #96333 - Auto configuration of ContextMenu item providers
See forge#96333
Description
ContextMenu item providers, implementing
\TYPO3\
are now automatically registered by adding the
backend.
tag, if
autoconfigure
is enabled in Services.
. The new
\TYPO3\
then
automatically receives those services and registers them.
All Core item providers extend the
Abstract
class, which is
usually also used by extensions. Due to the auto configuration, the context
information (table, record identifier and context) is no longer passed to the
__
, but instead to the new
set
method.
The
set
method is therefore required for all item providers.
Impact
The registration via
$GLOBALS
isn't evaluated anymore.
The item providers are retrieved from the container and are no longer
instantiated while passing context information as constructor arguments.
The context information is now passed to
set
.
Affected Installations
All extensions, registering custom ContextMenu item providers.
All extensions, extending
Abstract
and overwriting the
__
method.
All extensions, not extending
Abstract
, but implementing
\TYPO3\
directly.
Migration
Remove
$GLOBALS
from your ext_
file. If
autoconfigure
is
not enabled in your Configuration/
file,
manually configure your item providers with the
backend.
tag.
If your item providers extend
Abstract
and overwrite the
__
method, adjust the signature like shown below:
// Before
class MyItemProvider extends AbstractProvider {
public function __construct(string $table, string $identifier, string $context = '')
{
parent::__construct($table, $identifier, $context);
// My custom code
}
}
// After
class MyItemProvider extends AbstractProvider {
public function __construct()
{
parent::__construct();
// My custom code
}
}
In case you rely on the arguments, previously passed to
__
,
you can override the new
set
method, which is executed
prior to any other action like
can
.
// Before
class MyItemProvider extends AbstractProvider {
public function __construct(string $table, string $identifier, string $context = '')
{
parent::__construct($table, $identifier, $context);
if ($table === 'my_table') {
// Do something
}
}
// After
class MyItemProvider extends AbstractProvider {
public function setContext(string $table, string $identifier, string $context = ''): void
{
parent::setContext($table, $identifier, $context);
if ($table === 'my_table') {
// Do something
}
}
}
In case your item provider does not extend
Abstract
, but instead
implements the
\TYPO3\
directly, add the new
set
to the item provider.