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

キャッシュを可能にするこのアプローチに加えて、別の利点は、匿名関数ごとにリクエストごとに Closure クラスを作成する必要がないため、PHP が構成をより高速に解析することです。

于 2013-06-11T09:57:35.200 に答える