Der Symfony Cache, seine Keys und cache_namespace_callable
Der cached ggf (zB. mit der Option “with_layout: true”) auch eingebundene Partials. Sagen wir mal in einer Sidebar.
Schön schnipselweise werden die gecached.
Die haben dann auch jeweils einen CacheKey. Den sieht man auch wenn man für das dev environment den cache einschaltet in den kleinen bunten Info Kästen.
Ein Problem hat man aber dann, wenn jetzt ein Partial auf einer Seite je nach Parameter andere Dinge tun soll.
Dann hat man schnell die eine Version aus dem Cache (die zuerst aufgerufene eben) und nicht mehr die mehreren Erscheinungsformen.
Ist ja das gleiche Partial. Also lässt man das Cachen der Partials entweder weg, oder sorgt dafür dass die Dinger je nach Vorkommen einen anderen CacheKey kriegen. Und damit dann auch verschiedene Versionen gecached werden.
Dazu gibt es die Config Variable: “cache_namespace_callable” in der settings.yml.
Da kann man eine Funktion / statische Methode angeben, die einen alternativen CacheKey generiert.
Die kriegt dann eine Instanz vom sfViewCacheManager übergeben, der normalerweise den CacheKey generiert.
nur will man jetzt auf die original Methode zugreifen, und beispielsweise nur etwas anhängen, wird es etwas komplizierter.
Ruft man die aus seiner Custom Callback Funktion auf, ended man im Loop, weil die ->generateCachekey() Methode dann wiederum die callback Funktion aufruft uswusw.
Gehen tut das aber schon, zB mit diesem simplen Trick:
public static function GenerateMyCustomCacheKey( $internalUri, $hostName = '', $vary = '', $contextualPrefix = '', $sfViewCacheManager )
{
//den Wert von sf_cache_namespace_callable speichern
$callableFunction = sfConfig::get( 'sf_cache_namespace_callable' );
//sf_cache_namespace_callable auf false setzen
sfConfig::set( 'sf_cache_namespace_callable', false );
//jetzt die default methode auf unserer Instanz von sfViewCacheManager aufrufen
//sf_cache_namespace_callable ist ja nun false, also passiert auch kein loop
$key = $sfViewCacheManager->generateCachekey( $internalUri, $hostName = '', $vary = '', $contextualPrefix = '' );
//sf_cache_namespace_callable wieder herstellen
sfConfig::set( 'sf_cache_namespace_callable', $callableFunction );
//key manipulieren und zurückgeben
return $key . $myCustomSuffix;
}
dann eben nur noch in der settings.yml der entsprechenden APP die callback Funktion angeben und voila – hat man custom cache keys und kann sich zB. x Versionen eines Partials erzeugen lassen.
cache_namespace_callable: GenerateMyCustomCacheKey
oder
cache_namespace_callable: myStaticHelperClass::GenerateMyCustomCacheKey
Hi Max,
Kontext-abhängige Partial Cachekeys kannst du nach meinem Verständnis automatisch von symfony generieren lassen ohne eine eigene Implementierung.
http://www.symfony-project.org/reference/1_2/en/09-Cache#chapter_09_contextual
Gruss
/Christian
oh.
ja, in der Tat. Das hab ich komplett übersehen.
dass ich das Buch hier im Regal stehen hab, macht die Sache irgendwie nicht besser :D
Danke jedenfalls!
Jetzt bin ich doch glatt nochmal auf deinen Post gestossen.
Ich hatte naemlich jetzt wirklich die Anforderung den Cache Key manuell zu setzen. Da hast du sehr geholfen! Danke.