2013-04-04 2 views
4

Я пытаюсь создать новый (настроен и готов к использованию) Zend\Cache\Storage\Adapter\Memcached и получаю ошибку:Начало Zend Framework 2 Memcached работает

File: [project]/vendor/zendframework/zendframework/library/Zend/Cache/Storage/Adapter/MemcachedResourceManager.php:52 Message: No resource with id 'default'

Module класса

class Module implements ConfigProviderInterface, ServiceProviderInterface, AutoloaderProviderInterface { 
    ... 
    public function getServiceConfig() { 
     try { 
      return array (
       'factories' => array(
        ... 
        'Cache\Adapter\Memcached' => function ($serviceManager) { 
         $memcached = new Memcached($serviceManager->get('Cache\Adapter\MemcachedOptions')); 
         return $memcached; 
        }, 
        'Cache\Adapter\MemcachedOptions' => function ($serviceManager) { 
         return new MemcachedOptions(array(
          'ttl'   => 60 * 60 * 24 * 7, // 1 week 
          'namespace'  => 'cache_listener', 
          'key_pattern' => null, 
          'readable'  => true, 
          'writable'  => true, 
          'servers'  => 'localhost', 
         )); 
        }, 
        'Search\Model\CityStorage' => function ($serviceManager) { 
         return new CityStorage(
          $serviceManager->get('Search\Model\CityTable'), 
          $serviceManager->get('Cache\Adapter\Memcached') 
         ); 
        } 
       ) 
      ); 
     } 
     ... 
    } 
    ... 
} 

Controller класс

class SearchController extends AbstractActionController { 
    ... 
    public function searchCoursesAction() { 
     ... 
     return new ViewModel(array(
      ... 
      'cities' => $this->getServiceLocator()->get('Search\Model\CityStorage')->getCities(), 
     )); 
    } 
    ... 
} 

Storage класс

<?php 
namespace Search\Model; 

use Zend\Cache\Storage\Adapter\AbstractAdapter; 
use Search\Model\CityTable; 

class CityStorage { 

    /** 
    * @var CityTable 
    */ 
    private $cityTable; 
    /** 
    * @var AbstractAdapter 
    */ 
    private $cacheAdapter; 

    public function __construct(CityTable $cityTable, AbstractAdapter $cacheAdapter) { 
     $this->cityTable = $cityTable; 
     $this->cacheAdapter = $cacheAdapter; 
     $this->cacheCities(); 
    } 

    public function getCities() { 
     if (!$this->cacheAdapter->hasItem('cities')) { 
      $this->cacheCities(); 
     } 
     return $cacheAdapter->getItem('cities'); 
    } 

    private function cacheCities() { 
     // $cities = $this->cityTable->fetchAll()->toArray(); 
     // $this->cacheAdapter->setItem('cities', $cities); 
     $this->cacheAdapter->setItem('test', 123); 
    } 

} 

Как это работает?

Спасибо заранее!

EDIT:

Я закончил MemcachedOptions с заходящего servers (см. Выше) Теперь это работает!

Примечание: servers и не server, так как нет никакого метода setServer(), но только setServers() в Zend\Cache\Storage\Adapter\MemcachedOptions классе:

File: /var/www/itt/unisportr-zf/vendor/zendframework/zendframework/library/Zend/Stdlib/AbstractOptions.php:85 Message: The option "server" does not have a matching setServer setter method which must be defined

ответ

0

Как уже отмечалось выше, вы должны определить ресурс - означает базовый \Memcached экземпляр или один из вариантов автоматического создания ресурса. (Пожалуйста, взгляните на Zend\Cache\Storage\Adapter\MemcachedResource) ... Причиной этого является разделение одного или нескольких ресурсов \Memcached на разные экземпляры адаптера памяти.

Также обратите внимание, что AbstractAdapter не является маркером для типов подсказок - вы должны набирать подсказку с помощью StorageInterface;)