122 lines
4.2 KiB
ReStructuredText
122 lines
4.2 KiB
ReStructuredText
.. include:: /Includes.rst.txt
|
|
|
|
.. _breaking-106405-1742674605:
|
|
|
|
=====================================================
|
|
Breaking: #106405 - TypolinkBuilder signature changes
|
|
=====================================================
|
|
|
|
See :issue:`106405`
|
|
|
|
Description
|
|
===========
|
|
|
|
To enable dependency injection for TypolinkBuilder classes, several breaking
|
|
changes were introduced to the TypolinkBuilder architecture.
|
|
|
|
The following breaking changes have been made:
|
|
|
|
* The constructor of
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder` has been
|
|
removed. Extending classes can no longer rely on receiving
|
|
:php-short:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer` and
|
|
:php-short:`\TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController`
|
|
through the constructor.
|
|
|
|
* All concrete TypolinkBuilder implementations now implement the new
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface` and use
|
|
dependency injection via their constructors instead of extending
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder` with
|
|
constructor arguments.
|
|
|
|
* The method signature of the main link-building method has changed from
|
|
:php:`build(array &$linkDetails, string $linkText, string $target, array $conf)`
|
|
to
|
|
:php:`buildLink(array $linkDetails, array $configuration, ServerRequestInterface $request, string $linkText = '')`.
|
|
|
|
Impact
|
|
======
|
|
|
|
Custom TypolinkBuilder implementations extending
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder` will fail
|
|
with fatal errors due to the removed constructor and changed method signatures.
|
|
|
|
Extensions that instantiate TypolinkBuilder classes directly will also fail,
|
|
as the constructor signatures have fundamentally changed to use dependency
|
|
injection.
|
|
|
|
Affected installations
|
|
======================
|
|
|
|
TYPO3 installations with extensions that:
|
|
|
|
* Create custom TypolinkBuilder classes extending
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`
|
|
* Directly instantiate TypolinkBuilder classes in PHP code
|
|
* Override or extend the :php:`build()` method of TypolinkBuilder classes
|
|
|
|
Migration
|
|
=========
|
|
|
|
For custom TypolinkBuilder implementations:
|
|
|
|
1. Implement
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`
|
|
2. Use dependency injection in the constructor for required services
|
|
3. Replace the :php:`build()` method with :php:`buildLink()`
|
|
|
|
Note: Classes implementing
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface` are
|
|
automatically configured as public services in the dependency injection
|
|
container - no manual configuration is required.
|
|
|
|
Example migration:
|
|
|
|
.. code-block:: php
|
|
:caption: Before (TYPO3 v13 and lower)
|
|
|
|
use TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder;
|
|
|
|
class MyCustomLinkBuilder extends AbstractTypolinkBuilder
|
|
{
|
|
public function build(array &$linkDetails, string $linkText, string $target, array $conf): LinkResultInterface
|
|
{
|
|
// Custom link building logic
|
|
return new LinkResult('news', $linkText);
|
|
}
|
|
}
|
|
|
|
.. code-block:: php
|
|
:caption: After (TYPO3 v14+)
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface;
|
|
|
|
class MyCustomLinkBuilder implements TypolinkBuilderInterface
|
|
{
|
|
public function __construct(
|
|
// Inject required dependencies
|
|
) {}
|
|
|
|
public function buildLink(
|
|
array $linkDetails,
|
|
array $configuration,
|
|
ServerRequestInterface $request,
|
|
string $linkText = '',
|
|
): LinkResultInterface {
|
|
// Custom link building logic - access ContentObjectRenderer via:
|
|
$contentObjectRenderer = $request->getAttribute('currentContentObject');
|
|
return new LinkResult('news', $linkText);
|
|
}
|
|
}
|
|
|
|
For code that instantiates TypolinkBuilder classes directly:
|
|
|
|
It is strongly recommended to use the
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\LinkFactory` instead of instantiating
|
|
TypolinkBuilder classes directly. The
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\LinkFactory` handles proper
|
|
instantiation and dependency injection automatically.
|
|
|
|
.. index:: PHP-API, NotScanned, ext:frontend
|