4
votes

I'm trying to create a new (configured and ready to use) Zend\Cache\Storage\Adapter\Memcached and getting a error:

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

Module class

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

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

}

How to get it working?

Thank you in advance!

EDIT:

I've completed the MemcachedOptions with the setting servers (see above). Now it works!

Note: servers and not server, since there is no method setServer(), but only setServers() in the Zend\Cache\Storage\Adapter\MemcachedOptions class:

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

1

1 Answers

0
votes

As you already noted, you have to define a resource - means a basic \Memcached instance or one of the options auto-instantiate a resource. (Please take a look into Zend\Cache\Storage\Adapter\MemcachedResource) ... The reason for this is to share one or more \Memcached resources over different storage adapter instances.

Please also note that the AbstractAdapter isn't the marker for type hints - you should type hint by the StorageInterface ;)