2017-03-06 1 views
1

Ich versuche einige Werte im Cache zu speichern, wenn ich zum ersten Mal eine Seite lade. Dies ist der Code Ich verwende:Wie speichern und lesen Sie Werte im Cache mit Symfony und RedisAdapter?

$cached_items = [ 
    'main_nav' => $main_nav, 
    'sub_nav' => $sub_nav, 
    'footer_nav' => $footer_nav, 
    'view_as' => $view_as, 
]; 

$redisConnection = new Client('tcp://redis:6379'); 
$cache   = new RedisAdapter($redisConnection); 
$menu   = $cache->getItem('mmi_menus'); 

if ($menu->isHit()) { 
    return $menu->get(); 
} else { 
    $menu->set($cached_items); 
    $cache->save($menu); 
} 

Das Caching von einem nicht Symfony Controller getan wird - sagen wir mal, es ist eine eigenständige Datei.

Erstes Problem mit dem Code oben,

  • der else Zustand ist die ganze Zeit zu erreichen, und ich denke, es ist nicht da Werte gespeichert werden sollte. (Check here)

Zweites Problem, mit dieser Funktion in einem Symfony-Controller:

public function GenerateMenuItemsAction() 
{ 
    $redisConnection = new Client('tcp://redis:6379'); 
    $cache   = new RedisAdapter($redisConnection); 
    $menu   = $cache->getItem('mmi_menus'); 

    if ($menu->isHit()) { 
     return $this->render(
      'CommonBundle:Layout:menu.html.twig', 
      ['menu' => $menu->get()] 
     ); 
    } 
} 

$menu->isHit() ist null so die ganze Zeit ich diese Ausnahme von Symfony bin immer:

Ein Ausnahme wurde beim Rendern einer Vorlage ausgelöst ("Der Controller muss eine Antwort zurückgeben (Null gegeben). Haben Sie vergessen, irgendwo in yo eine Rückgabeanweisung hinzuzufügen Dein Controller? ").

aktualisieren

ich keine TTL bin mit afaik vielleicht irgendwie ein Standard ist Setup, aber das ist, wie der Abschnitt wie config.yml auf dem aussieht:

framework: 
    cache: 
     app: cache.adapter.redis 
     default_redis_provider: "redis://%redis_host%" 
     pools: 
      cache.pool1: 
       public: true 

Was mir fehlt

Hier? Irgendwelche Ideen?

+0

Setzen Sie Cache-Ttl? – zenith

+0

@mdma Ich bin nicht, siehe das Update auf dem OP – ReynierPM

+0

irgendwie seltsam, dass Sie redis Cache in config.yml definieren, sondern instanziieren Sie es mit 'neu' in Ihren Klassen. es sieht für mich aus, dass du nicht das konfigurierte, sondern jedesmal ein neues verwendest - und für diese könnte es sein, dass du kein richtiges ttl definiert hast. – LBA

Antwort

1

meine config.yml sieht wie folgt aus:

framework: 
    cache: 
    system: cache.adapter.apcu 
    default_redis_provider: redis://%redis_password%@%redis_host%:%redis_port% 
    pools: 
     redis_pool: 
      adapter: cache.adapter.redis 
      public: true 
      default_lifetime: 0 
      provider: cache.default_redis_provider 

So kann ich leicht (in meinem Controller) so etwas wie:

$this->get('redis_pool')->getItem('myitem'); 

Oder Sie können 'redis_pool' injizieren als Argument Ein Dienst.

Ich brauche keine neuen oder zusätzlichen Verbindungsinformationen/Konfiguration - alles wird in config.yml ausgeführt und steht als Dienst in der gesamten Anwendung zur Verfügung.

Verwandte Themen