Breaking: The partner controller is final
Description
\FGTCLB\ is
final
.
It serves the partner list (List), the partner map (Map), the partnerships
list (Partnerships) and the partnerships teaser (Partnerships).
Its collaborators are private constructor arguments now. The methods
inject and
inject are removed, and
redirect and
plugin
are private. All of them existed only so that a subclass could keep calling the
old constructor and the helpers of the shipped actions.
Every plugin controller of the academic extensions is final in 3.0. A plugin is extended through its events, not through a subclass of its controller.
Impact
A class that extends
Partner stops loading with a fatal
error,
Class ... cannot extend final class
FGTCLB\. That happens as soon as
anything loads the subclass, a plugin registered with it renders, or the
container is built with it.
An XCLASS of the controller fails the same way. The upgrade check
academic: of EXT:academic_base reports it as
an error. A
configure call that points one of the four plugins
at a subclass is not reported.
The plugins, their templates and their settings are unchanged. The behaviour is the same on TYPO3 v13 and v14.
Affected Installations
Installations with a class that extends
Partner, registered
for a plugin through
Extension, as an XCLASS,
or in the service container.
Migration
Remove the subclass, and the
configure call or the XCLASS
registration that points at it, so the shipped controller serves the plugin
again. Move each override to its replacement:
- Changing the filter or the sorting before the query: a listener of
\FGTCLB\, which adjusts or replaces the demand. See Feature: Change the partner list and map by event. The demand accepts only the sorting options of this extension and cannot express a sorting by another field,Academic Partners\ Event\ Modify Partner Demand Event tstampfor instance. A listener of the list event can hand back a result of its own query sorted that way. - A replaced or reduced result, other filter categories, or additional view
variables of the list and the map: a listener of
\FGTCLB\.Academic Partners\ Event\ Modify Partner List Event - Additional view variables of the partnerships list and teaser: a listener of the plugin view event of academic_base, see Feature: The plugins dispatch the plugin view event.
- Pagination of the partner list: the Pagination tab of the content element, see Feature: The partner list can be paginated.
- Filter selections that can be bookmarked: the list and the map answer a filter submission with a redirect to a GET URL, see Feature: Partner filter selections have a URL.
A subclass that adds a view variable:
final class PartnerController extends \FGTCLB\AcademicPartners\Controller\PartnerController
{
public function listAction(?array $demand = null): ResponseInterface
{
$this->view->assign('countries', $this->countryRepository->findAll());
return parent::listAction($demand);
}
}
does the same as a listener:
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\EventListener;
use FGTCLB\AcademicPartners\Event\ModifyPartnerListEvent;
use MyVendor\MyExtension\Domain\Repository\CountryRepository;
use TYPO3\CMS\Core\Attribute\AsEventListener;
final readonly class AddCountriesToPartnerList
{
public function __construct(
private CountryRepository $countryRepository,
) {}
#[AsEventListener(identifier: 'my-extension/add-countries-to-partner-list')]
public function __invoke(ModifyPartnerListEvent $event): void
{
$event->getView()->assign('countries', $this->countryRepository->findAll());
}
}
The listener acts on the list and the map alike. It reads
$event->get where it
means only one of them.