Zend Framework 2 - 符合缓存的服务工厂

时间:2013-06-11 08:19:41

标签: php zend-framework2 zend-framework-modules

zend文件application.config.php提供了一些缓存配置的方法,我发现它非常适合生产系统:

return array(
        'modules' => array(
                'Application',
        ),
        'module_listener_options' => array(
                'module_paths' => array(
                        './module',
                        './vendor'
                ),
                'config_glob_paths' => array('config/autoload/{,*.}{global,local}.php'),
                'config_cache_enabled' => true,
                'config_cache_key' => md5('config'),
                'module_map_cache_enabled' => true,
                'module_map_cache_key' => md5('module_map'),
                'cache_dir' => './data/cache',
        ),
);

然而,激活会立即导致

等错误
Fatal error: Call to undefined method Closure::__set_state()

这与作为闭包的工厂有关,例如:

'service_manager' => array(
    'factories' => array(
        'auth.service' => function($sm) {
            /* hic sunt ponies */
        },
    ),
),

不幸的是,the issues only告诉我为什么发生此错误,但不知道如何解决。

我如何重做这个和类似的factories,以便缓存可以与它们一起使用?

1 个答案:

答案 0 :(得分:11)

将工厂关闭重新设计为工厂类。

配置

'service_manager' => array(
    'factories' => array(
        'auth.service' => \Fully\Qualified\NS\AuthFactory::class,
    ),
),

工厂

namespace Fully\Qualified\NS;

use Zend\ServiceManager\FactoryInterface;
use Zend\ServiceManager\ServiceLocatorInterface;

class AuthFactory implements FactoryInterface
{
    public function createService(ServiceLocatorInterface $serviceLocator) {
        // create your object and set dependencies
        return $object
    }
}

除了这种使缓存成为可能的方法之外,另一个优点是PHP将更快地解析您的配置,因为它不必为每个anonymous function的每个请求创建一个Closure类。