Neos\Fusion\Core\Cache\RuntimeContentCache::preEvaluate PHP Метод

preEvaluate() публичный Метод

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).
public preEvaluate ( array &$evaluateContext, object $tsObject ) : array
$evaluateContext array The current evaluation context
$tsObject object The current TypoScript object (for "this" in evaluations)
Результат 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];
    }

Usage Example

Пример #1
0
 /**
  * Does the evaluation of a TypoScript instance, first checking the cache and if conditions and afterwards applying processors.
  *
  * @param AbstractTypoScriptObject $typoScriptObject
  * @param string $typoScriptPath
  * @param array $typoScriptConfiguration
  * @param array $cacheContext
  * @return mixed
  */
 protected function evaluateObjectOrRetrieveFromCache($typoScriptObject, $typoScriptPath, $typoScriptConfiguration, $cacheContext)
 {
     $output = null;
     $evaluationStatus = self::EVALUATION_SKIPPED;
     list($cacheHit, $cachedResult) = $this->runtimeContentCache->preEvaluate($cacheContext, $typoScriptObject);
     if ($cacheHit) {
         return $cachedResult;
     }
     $evaluateObject = true;
     if ($this->evaluateIfCondition($typoScriptConfiguration, $typoScriptPath, $typoScriptObject) === false) {
         $evaluateObject = false;
     }
     if ($evaluateObject) {
         $output = $typoScriptObject->evaluate();
         $evaluationStatus = self::EVALUATION_EXECUTED;
     }
     $this->lastEvaluationStatus = $evaluationStatus;
     if ($evaluateObject) {
         $output = $this->evaluateProcessors($output, $typoScriptConfiguration, $typoScriptPath, $typoScriptObject);
     }
     $output = $this->runtimeContentCache->postProcess($cacheContext, $typoScriptObject, $output);
     return $output;
 }