80 lines
2.4 KiB
ReStructuredText
80 lines
2.4 KiB
ReStructuredText
.. include:: /Includes.rst.txt
|
|
|
|
.. _deprecation-94956:
|
|
|
|
==================================
|
|
Deprecation: #94956 - Public $cObj
|
|
==================================
|
|
|
|
See :issue:`94956`
|
|
|
|
Description
|
|
===========
|
|
|
|
Frontend plugins receive an instance of :php:`\TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer` when
|
|
called via :php:`ContentObjectRenderer->callUserFunction()`. This is
|
|
typically the case for plugins called as :typoscript:`USER` or indirectly
|
|
as :typoscript:`USER_INT` type.
|
|
|
|
The instance of :php:`ContentObjectRenderer` has previously been set by
|
|
declaring a public (!) property :php:`cObj` in the consuming class.
|
|
|
|
Handing a :php:`ContentObjectRenderer` instance around this way is hard to
|
|
follow and has thus been deprecated: Declaring :php:`public $cObj` should
|
|
be avoided. Frontend plugins that need the current :php:`ContentObjectRenderer`
|
|
should have a public :php:`setContentObjectRenderer()` method instead.
|
|
|
|
|
|
Impact
|
|
======
|
|
|
|
Declaring :php:`public $cObj` in a class called by
|
|
:php:`ContentObjectRenderer->callUserFunction()` triggers a PHP :php:`E_USER_DEPRECATED` error.
|
|
|
|
|
|
Affected Installations
|
|
======================
|
|
|
|
Frontend extension classes that neither extend :php:`TYPO3\CMS\Frontend\Plugin\AbstractPlugin`
|
|
("pibase") nor Extbase :php:`TYPO3\CMS\Extbase\Mvc\Controller\ActionController`
|
|
and have a public property :php:`cObj` are affected.
|
|
|
|
|
|
Migration
|
|
=========
|
|
|
|
When instantiating the frontend plugin, :php:`ContentObjectRenderer->callUserFunction()`
|
|
now checks for a public method :php:`setContentObjectRenderer()` to explicitly set
|
|
an instance of the :php:`ContentObjectRenderer`.
|
|
|
|
Many plugins may not need this instance at all. If the ContentObjectRenderer instance
|
|
used within the plugin does not rely on further ContentObjectRenderer state, for instance
|
|
if it only calls :php:`stdWrap()` or similar without using state like :typoscript:`LOAD_REGISTER`,
|
|
the :php:`cObj` class property should be avoided and an own instance of ContentObjectRenderer
|
|
should be created.
|
|
|
|
Classes that do rely on current ContentObjectRenderer state should adapt their code.
|
|
|
|
Before::
|
|
|
|
class Foo
|
|
{
|
|
public $cObj;
|
|
}
|
|
|
|
|
|
After::
|
|
|
|
class Foo
|
|
{
|
|
protected $cObj;
|
|
|
|
public function setContentObjectRenderer(ContentObjectRenderer $cObj): void
|
|
{
|
|
$this->cObj = $cObj;
|
|
}
|
|
}
|
|
|
|
|
|
.. index:: Frontend, PHP-API, NotScanned, ext:frontend
|