Zend Framework 2 - фабрики обслуживания, соответствующие кешу

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 так кеш будет с ними работать?

1 ответ

Решение

Переработайте ваши фабричные закрытия к фабричным классам.

конфиг

'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 при каждом запросе для каждой анонимной функции.

Другие вопросы по тегам