ZF-9240: Zend_Cache_Manager does not allow custom backend

Description

This is a mix of improvement and bug fix. When I tried to use a custom backend class as cache backend, Zend_Cache_Manager fails. The sample below is about Zend_Cache_Backend_ZendServer_ShMem just to make easer to understand what's happening, but you can reproduce this using any other custom class.

h3. Usage


<?php

$manager = new Zend_Cache_Manager();
$manager->setCacheTemplate('custom',
                           array('frontend' => array('name' => 'Core'),
                                 'backend'  => array('name' => 'Zend_Cache_Backend_ZendServer_ShMem')));

$backend = $manager->getCache('custom')->getBackend();

h3. Expected result

$cache instanceof Zend_Cache_Backend_ZendServer_ShMem; // true

h3. Actual result

{quote} Fatal error: Uncaught exception 'Zend_Cache_Exception' with message 'file Zend/Cache/Backend/ZendCacheBackendZendserverShmem.php not found in include_path' in /path/to/library/Zend/Cache.php:208 Stack trace:

0 /path/to/library/Zend/Cache.php(147): Zend_Cache::throwException('file Zend/Cache...')

1 /path/to/library/Zend/Cache.php(93): Zend_Cache::_makeBackend('Zend_Cache_Back...', Array, false, false)

2 /path/to/library/Zend/Cache/Manager.php(172): Zend_Cache::factory('Core', 'Zend_Cache_Back...', Array, Array)

3 /var/www/sample.php(8): Zend_Cache_Manager->getCache('custom')

4 {main}

thrown in /path/to/library/Zend/Cache.php on line 208 {quote}

Actually it's perfectly expected, but there is no way to bypass this exception using Zend_Cache_Manager::setCacheTemplate() nor Zend_Cache_Manager::setTemplateOptions() once latest arguments to Zend_Cache::factory() is not available through Zend_Cache_Manager. Those arguments are necessary for custom backend usage. A nice improvement could be implemented.

http://framework.zend.com/manual/en/…

h3. Suggest

Zend_Cache::factory() has 4 arguments. See a slice of the code from Zend/Cache.php file:


/**
 * @param mixed  $frontend        frontend name (string) or Zend_Cache_Frontend_ object
 * @param mixed  $backend         backend name (string) or Zend_Cache_Backend_ object
 * @param array  $frontendOptions associative array of options for the corresponding frontend constructor
 * @param array  $backendOptions  associative array of options for the corresponding backend constructor
 * @param boolean $customFrontendNaming if true, the frontend argument is used as a complete class name ; if false, the frontend argument is used as the end of "Zend_Cache_Frontend_[...]" class name
 * @param boolean $customBackendNaming if true, the backend argument is used as a complete class name ; if false, the backend argument is used as the end of "Zend_Cache_Backend_[...]" class name
 * @param boolean $autoload if true, there will no require_once for backend and frontend (usefull only for custom backends/frontends)
 */
public static function factory($frontend, $backend, $frontendOptions = array(), $backendOptions = array(), $customFrontendNaming = false, $customBackendNaming = false, $autoload = false);

Zend_Cache_Manager doesn't allow us to use fifth, sixth nor seventh arguments of this method. We could add to Zend_Cache_Manager::$_optionTemplates new optional entries.


array(
    'sample' => array(
        'frontend' => array(
            'name'          => 'something',
            'custom_naming' => false,       // HERE (fifth)
            'options'       => array(),
        ),
        'backend' => array(
            'name'          => 'another-thing',
            'custom_naming' => false,       // HERE (sixth)
            'options'       => array(),
        ),
        'autoload' => false,                // and HERE (seventh)
    ),
)

Attached is a patch that implements that improvement. Below is another sample, this time using the new template arguments.


<?php

$manager = new Zend_Cache_Manager();
$manager->setCacheTemplate('custom',
                           array('frontend' => array('name' => 'Core'),
                                 'backend'  => array('name'          => 'Zend_Cache_Backend_ZendServer_ShMem',
                                                     'custom_naming' => true)),
                                 'autoload' => true);

$backend = $manager->getCache('custom')->getBackend();

Comments

attached file that implements this improvement

ZF-9240 contains a patch that solve this issue reported by ZF-9134

Correction in revision 21977.

Attributed fix version for Mini Release.