Benutzer: Gast
Eintrag: Extbase 6+: Eigenen Cache in Extension verwenden

Extbase 6+: Eigenen Cache in Extension verwenden

von: marcel
Tags: Typo3, Extbase, Cache
Kreise: Typo3

ext_tables.sql

Code: SQL
#
# TABLE STRUCTURE FOR TABLE 'cf_extkey_cache'
#
CREATE TABLE cf_extkey_cache (
	id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	identifier VARCHAR(250) DEFAULT '' NOT NULL,
	crdate INT(11) UNSIGNED DEFAULT '0' NOT NULL,
	content mediumblob,
	expires INT(11) UNSIGNED DEFAULT '0' NOT NULL,
	PRIMARY KEY (id),
	KEY cache_id (identifier)
) ENGINE=InnoDB;

#
# TABLE STRUCTURE FOR TABLE 'cf_extkey_cache_tags'
#
CREATE TABLE cf_extkey_cache_tags (
	id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	identifier VARCHAR(250) DEFAULT '' NOT NULL,
	tag VARCHAR(250) DEFAULT '' NOT NULL,
	PRIMARY KEY (id),
	KEY cache_id (identifier),
	KEY cache_tag (tag)
) ENGINE=InnoDB;

ext_localconf.php

Code: PHP
<?php
if (!defined('TYPO3_MODE')) {
	die ('Access denied.');
}

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
	'VENDOR.' . $_EXTKEY,
	'Pi1',
	array(
		'Display' => 'show'
	),
	// non-cacheable actions
	array(
		'Display' => 'show'
	)
);

/**
 * register cache for extension
 */
if (!is_array($TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extkey_cache'])) {
  $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extkey_cache'] = array();
  $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extkey_cache']['frontend'] = 'TYPO3\\CMS\\Core\\Cache\\Frontend\\VariableFrontend';
  $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extkey_cache']['backend'] = 'TYPO3\\CMS\\Core\\Cache\\Backend\\Typo3DatabaseBackend';
  $TYPO3_CONF_VARS['SYS']['caching']['cacheConfigurations']['extkey_cache']['options']['compression'] = 1;
}

?>

Classes/Controller/DisplayController.php

Code: PHP
<?php
namespace VENDOR\Extkey\Controller;

/**
 * @license http://www.gnu.org/licenses/gpl.html GNU General Public License, version 3 or later
 */
class DisplayController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

  /**
   * itemRepository
   *
   * @var \VENDOR\Extkey\Domain\Repository\ItemRepository
   * @inject
   */
  protected $itemRepository;

  /**
   * action show
   *
   * @return void
   */
  public function showAction() {
    /*
     * get/set some vars
     */
    $args = $this->request->getArguments();
    $itemUid = intval($args['item']);

    /*
     * Try to get the cached content.
     * If there is content in cache, just return it.
     * Otherwise generate the content, save in cache and then return it.
     */
    // calculate the identifier for the cached entry
    $cacheIdentifier = $this->calculateCacheIdentifier(array(
      $GLOBALS["TSFE"]->sys_language_uid, // cache depends on the language
      $GLOBALS["TSFE"]->fe_user->groupData['uid'], // cache depends on the userGroup
      $itemUid, // cache depends on the object to show
    ));

    // instantiate the cache
    $cache = $GLOBALS['typo3CacheManager']->getCache('extkey_cache');

    // try to find the cached content
    if (($content = $cache->get($cacheIdentifier)) === false) { // the cached content is NOT available
      // generate the content
      $content = $this->getShowActionContent($itemUid);

      // save content in cache
      $cache->set($cacheIdentifier, $content, array(
        "showAction_" . $itemUid
      ));
    }

    return $content;
  }
  
  /**
   * Method to get the content for the showAction
   * @param \integer $itemUid
   * @return \string
   */
  public function getShowActionContent($itemUid) {
    /*
     * find the item, set it to view and return the rendered content
     */
    $item = $this->itemRepository->getByUid($itemUid);
    $this->view->assign('item', $item);
    return $this->view->render();
  }

  /**
   * Calculates the cache identifier
   * @param \array $arr
   * @return \string
   */
  public static function calculateCacheIdentifier($arr) {
    return sha1(json_encode($arr)); // in average json_encode is four times faster than serialize()
  }
}
?>
(1) Jürgen Venne schrieb am 19. 11. 2016 um 13:49 Uhr
Very nice Example, straight and clear. Thank you!
Instantiate Cache Manager with objectManager not $GLOBALS
$cache = $GLOBALS['typo3CacheManager']->getCache('extkey_cache');
should be
$cache = GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Cache\\CacheManager')->getCache('extkey_cache');