97 lines
3.1 KiB
ReStructuredText
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
|