127 lines
4.2 KiB
ReStructuredText
127 lines
4.2 KiB
ReStructuredText
.. include:: /Includes.rst.txt
|
|
|
|
.. _deprecation-106405-1742674605:
|
|
|
|
=====================================================
|
|
Deprecation: #106405 - AbstractTypolinkBuilder->build
|
|
=====================================================
|
|
|
|
See :issue:`106405`
|
|
|
|
Description
|
|
===========
|
|
|
|
The :php:`build()` method in
|
|
:php:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`
|
|
has been deprecated in favor of the new
|
|
:php:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`.
|
|
|
|
When creating custom TypolinkBuilder classes, the traditional approach was to:
|
|
|
|
1. Extend :php:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`
|
|
2. Implement the :php:`build()` method
|
|
3. Receive dependencies via the constructor
|
|
|
|
This approach is now deprecated.
|
|
The new, recommended pattern is to implement
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`
|
|
directly.
|
|
|
|
The :php:`ContentObjectRenderer` property in
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`
|
|
has also been deprecated and will be removed in TYPO3 v15.0.
|
|
It should now be accessed via the :php:`\Psr\Http\Message\ServerRequestInterface`
|
|
object instead.
|
|
|
|
Impact
|
|
======
|
|
|
|
Extension authors who have created custom TypolinkBuilder classes that extend
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder` will see
|
|
deprecation warnings when their link builders are used.
|
|
|
|
Deprecation warnings occur when:
|
|
|
|
* A custom TypolinkBuilder class still implements the :php:`build()` method
|
|
* Code accesses the deprecated :php:`$contentObjectRenderer` property
|
|
* Dependencies are passed through the constructor instead of DI
|
|
|
|
Affected installations
|
|
======================
|
|
|
|
TYPO3 installations with extensions that:
|
|
|
|
* Create custom TypolinkBuilder classes extending
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder`
|
|
* Override or extend the :php:`build()` method
|
|
* Access the :php:`$contentObjectRenderer` property directly
|
|
|
|
Migration
|
|
=========
|
|
|
|
For end users, link generation continues to work as before using either:
|
|
|
|
* :php-short:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer`,
|
|
method `typolink()`
|
|
* :php-short:`\TYPO3\CMS\Frontend\Typolink\LinkFactory`
|
|
|
|
These public APIs are not affected and do not trigger deprecations.
|
|
|
|
For extension developers, custom TypolinkBuilder implementations should now
|
|
use the new :php:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`.
|
|
|
|
1. Implement the new interface:
|
|
|
|
.. code-block:: php
|
|
:caption: Recommended migration approach
|
|
|
|
use Psr\Http\Message\ServerRequestInterface;
|
|
use TYPO3\CMS\Frontend\Typolink\AbstractTypolinkBuilder;
|
|
use TYPO3\CMS\Frontend\Typolink\LinkResultInterface;
|
|
use TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface;
|
|
|
|
// Before (deprecated)
|
|
class MyCustomLinkBuilder extends AbstractTypolinkBuilder
|
|
{
|
|
public function build(
|
|
array &$linkDetails,
|
|
string $linkText,
|
|
string $target,
|
|
array $conf
|
|
): LinkResultInterface {
|
|
// Custom logic using $this->contentObjectRenderer
|
|
}
|
|
}
|
|
|
|
// After (recommended)
|
|
class MyCustomLinkBuilder implements TypolinkBuilderInterface
|
|
{
|
|
public function buildLink(
|
|
array $linkDetails,
|
|
array $configuration,
|
|
ServerRequestInterface $request,
|
|
string $linkText = ''
|
|
): LinkResultInterface {
|
|
$contentObjectRenderer = $request->getAttribute(
|
|
'currentContentObject'
|
|
);
|
|
// Custom logic using $contentObjectRenderer
|
|
}
|
|
}
|
|
|
|
2. Use dependency injection for required services instead of accessing them
|
|
through global state or constructor arguments.
|
|
|
|
3. Retrieve :php:`ContentObjectRenderer` from the request object rather than
|
|
the deprecated property.
|
|
|
|
All implementations of
|
|
:php-short:`\TYPO3\CMS\Frontend\Typolink\TypolinkBuilderInterface`
|
|
are automatically registered as **public services** in the Dependency Injection
|
|
container, so no manual service configuration is necessary.
|
|
|
|
Extensions can maintain backward compatibility during the transition by
|
|
implementing both the old :php:`build()` and the new :php:`buildLink()` methods.
|
|
|
|
.. index:: PHP-API, NotScanned, ext:frontend
|