2013-04-04 63 views
4

我试图创建一个新的(配置并准备使用)Zend\Cache\Storage\Adapter\Memcached并得到一个错误:入门Zend框架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 class

<?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); 
    } 

} 

如何让它正常工作?

预先感谢您!

编辑:

我已经完成了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键入提示;)