2016-05-12 5 views
1

Ich habe versucht, Memcached in DoctrineORM Modul meines ZendFramework 2-Projekt zu konfigurieren Caching-Abfragen, die Ergebnisse und Metadaten folgen diesem Tutorial https://github.com/doctrine/DoctrineORMModule/blob/master/docs/cache.md In module.config.phpWie konfiguriert man eine Entität als Teil des Second-Level-Cache in DoctrineORMModule?

<?php 

return array(
    'service_manager' => array(
     'invokables' => array(
//   ... 
     ), 
     'factories' => array(
      'doctrine.cache.my_memcached' => function ($sm) { 
       $cache = new \Doctrine\Common\Cache\MemcachedCache(); 
       $memcache = new Memcached(); 
       $memcache->addServer('localhost', 11211); 
       $cache->setMemcached($memcache); 
       return $cache; 
      }, 
      'MemcachedFactory' => \Application\Service\Cache\MemcachedFactory::class, 
     ) 
    ), 
    'doctrine' => array(
     'cache' => array(
      'memcached' => array(
       'namespace' => '_Doctrine', 
       'instance' => 'MemcachedFactory', 
      ), 
     ), 
     'configuration' => array(
      'orm_default' => array(
       'query_cache' => 'memcached', 
       'result_cache' => 'memcached', 
       'metadata_cache' => 'memcached', 
       'hydration_cache' => 'memcached', 
       'second_level_cache' => [ 
        'enabled' => true, 
        'default_lifetime' => 200, 
        'default_lock_lifetime' => 500, 
        'file_lock_region_directory' => './data/cache', 
        'regions' => [ 
         'My\FirstRegion\Name' => [ 
          'lifetime' => 800, 
          'lock_lifetime' => 1000 
         ], 
         'My\SecondRegion\Name' => [ 
          'lifetime' => 10, 
          'lock_lifetime' => 20 
         ], 
        ], 
       ], 
      ), 
     ), 
     'driver' => array(
      '_driver' => array(
       'class' => 'Doctrine\ORM\Mapping\Driver\AnnotationDriver', 
       'cache' => 'my_memcached', 
       'paths' => array(__DIR__ . '/../src/Application/Entity') 
      ), 
      'orm_default' => array(
       'drivers' => array(
        'Application\Entity' => '_driver' 
       ), 
      ), 
     ), 
    ), 
); 

und nachdem ich schaffen ein Verfahren, wie das auszuführen folgende:

public function findById($id) { 
    $qb = $this->entityManager->createQueryBuilder(); 
    $qb->select("u") 
      ->from(User::class, "u") 
      ->where($qb->expr()->eq("u.id", ":id")) 
      ->setParameter("id", (int) $id); 

    return $qb->getQuery()->setCacheable(true)->getOneOrNullResult(); 
} 

und nach, erhalte ich eine Doctrine\ORM\Cache\CacheException mit Nachricht:

Die Entität "Application \ Entity \ User" wurde nicht als Teil des Cache der zweiten Ebene konfiguriert.

Wer kann mir vorschlagen, dieses Problem zu lösen?

+0

Bitte, weitere Informationen über Ihre Memcached-Konfiguration hinzufügen – ceadreak

+0

Above ich Informationen über meine Memcached-Konfiguration hinzugefügt –

Antwort

0

Fügen Sie diese auf der USER-Klasse:

* @ORM\Cache(usage="NONSTRICT_READ_WRITE")