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