Files
cms-core/Documentation/Changelog/14.0/Feature-106405-TypolinkBuilderInterface.rst

97 lines
3.1 KiB
ReStructuredText

.. include:: /Includes.rst.txt
.. _feature-106405-1742674556:
===========================================
Feature: #106405 - TypolinkBuilderInterface
===========================================
See :issue:`106405`
Description
===========
A new interface :php:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`
has been introduced to provide a more flexible way to generate links in TYPO3.
The interface defines a :php:`buildLink()` method that replaces the previous
:php:`build()` method approach used when extending from
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`.
All Core `TypolinkBuilder` implementations now implement this interface and
use dependency injection for improved service composition and testability.
The interface method signature is as follows:
.. code-block:: php
use TYPO3\CMS\Frontend\Typolink;
public function buildLink(
array $linkDetails,
array $configuration,
ServerRequestInterface $request,
string $linkText = ''
): LinkResultInterface;
Impact
======
* All implementations of
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface` are
automatically configured as public services in the dependency injection
container, removing the need for manual service configuration.
* `TypolinkBuilder` classes can now use proper dependency injection through
their constructors, improving testability and aligning with TYPO3's
architectural best practices.
* The :php-short:`\Psr\Http\Message\ServerRequestInterface` is now passed
directly, providing access to the request context without relying on global
state.
* The new interface introduces a cleaner separation of concerns
and more explicit parameter passing.
Example usage
=============
Creating a custom `TypolinkBuilder` using the new interface:
.. code-block:: php
:caption: EXT:my_extension/Classes/Typolink/MyCustomLinkBuilder.php
use Psr\Http\Message\ServerRequestInterface;
use TYPO3\CMS\Frontend\Typolink\LinkResult;
use TYPO3\CMS\Frontend\Typolink\LinkResultInterface;
use TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface;
final readonly class MyCustomLinkBuilder implements TypolinkBuilderInterface
{
public function __construct(
private MyCustomService $customService,
private AnotherService $anotherService,
) {}
public function buildLink(
array $linkDetails,
array $configuration,
ServerRequestInterface $request,
string $linkText = ''
): LinkResultInterface {
// Access ContentObjectRenderer from the request
$contentObjectRenderer = $request->getAttribute('currentContentObject');
// Use injected services
$processedData = $this->customService->process($linkDetails);
// Build and return link result
return new LinkResult($processedData['url'], $linkText);
}
}
Registering the TypolinkBuilder class is still necessary via
:php:`$GLOBALS['TYPO3_CONF_VARS']`.
.. index:: PHP-API, ext:frontend