TYPO3 9.5 - Кэширование QuerieResult в моем расширении - функция map () на нуле - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь заставить кэш Produclist работать в моем плагине.

Мой ext_localconf.php

if (!is_array($GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['product_cache'])) {
    $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['product_cache'] = [];
}
if( !isset($GLOBALS['TYPO3_CONF_VARS'] ['SYS']['caching']['cacheConfigurations']['product_cache']['frontend'] ) ) {
    $GLOBALS['TYPO3_CONF_VARS'] ['SYS']['caching']['cacheConfigurations']['product_cache']['frontend'] = 'TYPO3\\CMS\\Core\\Cache\\Frontend\\VariableFrontend';
}

И мой контроллер

$cache = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Cache\CacheManager::class)->getCache('product_cache');

if(($products = $cache->get($cacheIdentifier)) === FALSE){

    $objectManager = GeneralUtility::makeInstance(ObjectManager::class);
    $productController = $objectManager->get(ProductController::class);
    $productController->setSettings($this->settings);
    $products = $productController->getEditedProducts($catId);
    $cache->set($cacheIdentifier, $products, ['productajax'], 84600);

}

Нормальное содержимое, напримерСтрока, int или массив работает нормально, но когда я пытаюсь это сделать с DatabaseResultquerie, чем система с этой ошибкой: Call to a member function map() on null

enter image description here

(толькона get, set отлично работает)

Ответы [ 2 ]

1 голос
/ 06 июня 2019

Вы не можете кэшировать этот класс, потому что это подразумевает его сериализацию, и этот класс содержит явные методы, которые предотвращают включение определенных свойств в сериализованную строку. Фактически, единственным свойством, которое является , является query (входной запрос, вызвавший результат).

Возможно, вы сможете кешировать QueryResult, а затем вручную вызвать методы внедрения, чтобы добавить экземпляры DataMapper и т. Д. - но даже если вы это сделаете, сериализованный QueryResult не будет содержать результаты и будет запускаться снова при каждой попытке загрузки сущность от него.

Правильный способ - извлечь в не-QueryResult (массив, итератор по своему выбору), который, как вы знаете, позволит сериализовать результаты.

См .: https://github.com/TYPO3/TYPO3.CMS/blob/v8.7.26/typo3/sysext/extbase/Classes/Persistence/Generic/QueryResult.php#L250

0 голосов
/ 06 июня 2019

В случае, если это Ajax-контроллер, вы можете кэшировать сгенерированный ответ JSON.

...