3

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 */
        },
    ),
),

不幸的是,这些 问题 告诉我为什么会发生这个错误,而不是告诉我如何解决它。

我怎样才能重做这个和类似factories的东西,以便缓存可以与它们一起使用?

4

1 回答 1

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 将更快地解析您的配置,因为它不必为每个匿名函数的每个请求创建一个 Closure 类。

于 2013-06-11T09:57:35.200 回答