我有以下问题:
<?php
declare(strict_types=1);
namespace Abc\Def\Services;
class TypoScriptProvider extends \TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager
{
public function __construct()
{
}
public function getTypoScriptSetupByPageid($pageId = null): array
{
$configurationManager = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\Configuration\\BackendConfigurationManager');
$configurationManager->currentPageId = $pageId;
$extbaseFrameworkConfiguration = $configurationManager->getTypoScriptSetup();
return $extbaseFrameworkConfiguration;
}
}
对于 TYPO3 v12 来说这是可行的,但现在 TYPO3 决定将
BackendConfigurationManager
作为 v13 中的最后一个类。我怎样才能延长这门课?
我试过这个
<?php
declare(strict_types=1);
namespace Abc\Def\Services;
use TYPO3\CMS\Extbase\Configuration\BackendConfigurationManager;
class TypoScriptProvider
{
protected BackendConfigurationManager $backendConfigurationManager;
public function __construct(BackendConfigurationManager $backendConfigurationManager)
{
// Dependency Injection
$this->backendConfigurationManager = $backendConfigurationManager;
}
public function getTypoScriptSetupByPageid(int $pageId = null): array
{
// Verwende eine Methode, um die Seiten-ID zu setzen
$this->backendConfigurationManager->getCurrentPageId($pageId);
// Abrufen des TypoScript-Setups
$typoScriptSetup = $this->backendConfigurationManager->getTypoScriptSetup();
return $typoScriptSetup;
}
}
但是
currentPageId
无法访问,因为它现在受到保护。 ich怎么能做到这一点?
@internal 仅在 Extbase 中使用,不是 TYPO3 Core API 的一部分。
来自 PHP-DocBlock 类。该类是内部类,不是公共 API 的一部分。它可以随时更改,而不会破坏或记录公共可用的 API。
重点是,
BackendConfigurationManager
绑定到 ServerRequestInterface
并使用这些请求属性和参数。这个类已经被重构为 Symfony DI'able,并且要求必须从该类中删除状态,因为它现在成为一个真正的服务。并且 DI 服务器必须是无状态的,这意味着不再有 current page
属性和 setter/getter。其余的私有方法使用请求信息来检索值,并使用运行时缓存来存储该类外部的状态。
您也不应该直接使用 BackendConfigurationManager,而应该使用 ConfigurationManager,它根据传递的
ServerRequestInterface $request
对象中的属性使用前端或后端管理器。
public function getTypoScriptSetup(ServerRequestInterface $request): array
这是TYPO3 v13中方法的签名。这意味着您需要传递一个请求对象,该对象需要包含要设置的必需属性,因为该类从请求中读取页面信息。
在后端的情况下,它使用帖子正文中的
id
值或在上下文中获取参数。
如果不知道您的确切用例是什么,就很难给出准确的示例和指导来以正确的方式实现它。
您可以尝试创建一个虚假请求,如下例取自 TYPO3 核心测试(TBH 未在真实环境中进行测试):
$request = (new ServerRequest())->withQueryParams(['id' => 123]);
$typoScriptSetup = $this->backendConfigurationManager->getTypoScriptSetup($request);
对于
BackendConfigurationManager
的另一种方法同样有效,它需要传递 ServerRequestInterace
对象。