TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
.. 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
|
||||
Reference in New Issue
Block a user