.. 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