/**
* Check for cached evaluation and or collect metadata for evaluation
*
* Try to get a cached segment for the current path and return that with all uncached segments evaluated if it
* exists. Otherwise metadata for the cache lifetime is collected (if configured) for nested evaluations (to find the
* minimum maximumLifetime).
*
* @param array $evaluateContext The current evaluation context
* @param object $tsObject The current TypoScript object (for "this" in evaluations)
* @return array Cache hit state as boolean and value as mixed
*/
public function preEvaluate(array &$evaluateContext, $tsObject)
{
if ($this->enableContentCache) {
if ($evaluateContext['cacheForPathEnabled']) {
$evaluateContext['cacheIdentifierValues'] = $this->buildCacheIdentifierValues($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject);
$self = $this;
$segment = $this->contentCache->getCachedSegment(function ($command, $additionalData, $cache) use($self, $evaluateContext, $tsObject) {
if (strpos($command, 'eval=') === 0) {
$unserializedContext = $self->unserializeContext($additionalData['context']);
$path = substr($command, 5);
$result = $self->evaluateUncached($path, $unserializedContext);
return $result;
} elseif (strpos($command, 'evalCached=') === 0) {
$identifier = substr($command, 11);
$cacheDiscriminator = $this->runtime->evaluate($additionalData['path'] . '/__meta/cache/entryDiscriminator');
$cacheIdentifier = substr($identifier, 0, strpos($identifier, '_')) . '_' . md5($cacheDiscriminator);
$result = $cache->get($cacheIdentifier);
if ($result === false) {
$unserializedContext = $self->unserializeContext($additionalData['context']);
$maximumLifetime = null;
if (isset($evaluateContext['configuration']['maximumLifetime'])) {
$maximumLifetime = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/maximumLifetime', $tsObject);
}
$cacheTags = $this->buildCacheTags($evaluateContext['configuration'], $evaluateContext['typoScriptPath'], $tsObject);
$result = $self->evaluateUncached($additionalData['path'], $unserializedContext);
$cache->set($cacheIdentifier, $result, $cacheTags, $maximumLifetime);
}
return $result;
} else {
throw new Exception(sprintf('Unknown uncached command "%s"', $command), 1392837596);
}
}, $evaluateContext['typoScriptPath'], $evaluateContext['cacheIdentifierValues'], $this->addCacheSegmentMarkersToPlaceholders);
if ($segment !== false) {
return [true, $segment];
} else {
$this->addCacheSegmentMarkersToPlaceholders = true;
}
$this->cacheMetadata[] = ['lifetime' => null];
}
if ($evaluateContext['cacheForPathEnabled'] && $evaluateContext['cacheForPathDisabled']) {
$evaluateContext['cacheDiscriminator'] = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/entryDiscriminator');
}
if (isset($evaluateContext['configuration']['maximumLifetime'])) {
$maximumLifetime = $this->runtime->evaluate($evaluateContext['typoScriptPath'] . '/__meta/cache/maximumLifetime', $tsObject);
if ($maximumLifetime !== null && $this->cacheMetadata !== []) {
$cacheMetadata =& $this->cacheMetadata[count($this->cacheMetadata) - 1];
$cacheMetadata['lifetime'] = $cacheMetadata['lifetime'] !== null ? min($cacheMetadata['lifetime'], $maximumLifetime) : $maximumLifetime;
}
}
}
return [false, null];
}