Как пользоваться Глобалом.на PHP/местные.PHP-конфигурации в getConfig () модуля в приложении Zend Framework 2?


В приложении ZF2 у меня есть несколько кофигов, которые: 1. потребность быть различным зависящим от окружающей среды; 2. специфичны для конкретного модуля. Я сейчас использую его как здесь описано:

Глобальный.PHP и местные.php

return array(
    ...
    'modules' => array(
        'Cache' => array(
            'ttl' => 1, // 1 second
        )
    )
    ...
);

Класс модуля

Module {
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'ZendCacheAdapterMemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'           => $this->getConfig()['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

Он работает нормально, но я считаю, что конкретные настройки модуля должны быть доступны через одно центральное место в модуле-метод getConfig() класса Module. Нравится это:

class Module {

    public function getConfig() {
        $moduleConfig = include __DIR__ . '/config/module.config.php';
        $application = $this->getApplicationSomehow(); // <-- how?
        $applicationModuleConfig = $application->getConfig()['modules'][__NAMESPACE__];
        $config = array_merge($moduleConfig, $applicationModuleConfig);
        return $config;
    }
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'ZendCacheAdapterMemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'            => $serviceManager->get('Config')['modules']['Cache']['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}
Проблема в том, что я не понимаю, как получить доступ к глобальному.на PHP/местные.PHP-конфигурации в getConfig() модуля. Как я могу это сделать?
2 2

2 ответа:

Каждая отдельная конфигурация каждого отдельного загруженного модуля будет объединена в одну единственную конфигурацию. А именно это будет:

$serviceManager->get('config');

Причина за (global|local).config.php просто для цели использования. Глобальные конфигурационные файлы всегда должны быть развернуты . Однако локальные конфигурационные файлы должны развертываться только как дистрибутивы, псевдоним local.config.php.dist.

Дистрибутивы не будут загружены, независимо от того, где они находятся. Однако общее понятие ZF2 состоит в том, чтобы скопировать распределяемые файлы в /config/autoload-каталог приложения ZF2 и переименуйте их в local.config.php

Один пример:

// YourModule/config/module.config.php
return array(
    'key' => 1337
);

// YourModule/config/local.yourmodule.php.dist
return array(
    'key' => 7331
);
Теперь при публикации / развертывании приложения будет использоваться только module.config.php. Если кто-то захочет изменить конфигурацию вашего модуля, он никогда не будет касаться module.config.php, так как этот файл будет постоянно перезаписываться при обновлении вашего модуля.

Однако то, что люди могут сделать, это скопировать:

YourModule/config/local.yourmodule.php.dist
to
/config/autoload/local.yourmodule.php

И измените конфигурацию значения внутри этой локальной конфигурации.

Чтобы понять:

  • вы всегда должны настроить свой модуль как можно лучше для живого сценария.
  • Если у вас есть специфические для среды потребности, перепишите эту конфигурацию с помощью local-config
  • Локальные конфигурации никогда не развертываются автоматически, это ручная задача, которую необходимо выполнить изнутри самой среды

Надеюсь, что это немного больше ясно

В конечном счете:

  • настройте свой модуль для живого сценария
  • на вашей машине разработки создайте /config/autoload/mymodule.local.php и перепишите ваш ttl с его значением разработки

Порядок загрузки:

Последняя интересная часть, о которой я совершенно забыл, - это порядок загрузки конфигурационных файлов. Поскольку все файлы объединены, это важно отметить!
  • первая загрузка-это /config/application.config.php
  • второй загрузкой будет каждый модуль /modules/{module}/config/module.config.php *
  • И последнее, но не менее важное: будут загружены автоматически загружаемые файлы /config/autoload/{filename}.php

Астерикс на самом деле Нет module.config.php который называется, а точнее Module-классы конфигурационных функций. В основном это:

Если я понимаю эту часть ConfigListener правильно, тогда getConfig() будет вызван первым и все специальные {feature}ProviderInterfaces будут перезаписывать данные getConfig(), но не принимайте это как должное, это потребует проверки!

Вы не должны получать доступ к другим модулям настройки в вашем Module#getConfig(). Если вы полагаетесь на другую конфигурацию, это может быть только для служебных целей. Следовательно, вы полагаетесь на Module#getServiceConfig(), а внутри фабрик у вас есть доступ к ServiceManagerи доступ к вашим конфигурациям с $serviceManager->get('config');. (см. комментарий Сэма )

Порядок загрузки конфигураций по умолчанию:

  1. /config/application.config.php, то есть исходный конфигурационный файл; не для конфигураций модулей; вот шаблон имени файла для файлы конфигурации для загрузки определены ('config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')).
  2. {ModuleNamespace}\Module#getConfig() (например, Cache\Module#getConfig()), что по соглашению должно загрузить его /module/{ModuleNamespace}/config/module.config.php;
  3. /config/autoload/global.php, который не должен содержать каких-либо специфичных для модуля конфигураций (см. ниже);
  4. /config/autoload/local.php, который содержит специфические для среды настройки, также не должен содержать никаких специфичных для модуля конфигураций (см. ниже); он не должен быть версионным / развернутым;
  5. /config/autoload/{ModuleNamespaceLowerCased}.local.php (например, cache.local.php), который содержит только модуль и параметры среды и должен не быть версионным/;

Для модуля Cache выше могут быть следующие конфигурационные файлы:

  • /module/Cache/config/module.config.php -- полный набор конфигураций модулей; загружается по Cache\Module#getConfig()
  • /module/Cache/config/cache.local.php.dist -- пример для /config/autoload/cache.local.php
  • /config/autoload/cache.local.php -- конфигурация модуля для конкретной среды

Настройка ttl может быть доступна из любого места, где имеется доступ к сервисному локатору. Например, в заводских методах Cache\Module#getServiceConfig()

class Module {

    public function getConfig() {
        $moduleConfig = include __DIR__ . '/config/module.config.php';
        $application = $this->getApplicationSomehow(); // <-- how?
        $applicationModuleConfig = $application->getConfig()['modules'][__NAMESPACE__];
        $config = array_merge($moduleConfig, $applicationModuleConfig);
        return $config;
    }
    ...
    public function getServiceConfig() {
        try {
            return array (
                'factories' => array(
                    'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
                        return new MemcachedOptions(array(
                            'ttl'            => $serviceManager->get('Config')['ttl'],
                            ...
                        ));
                    },
                    ...
                )
            );
        }
        ...
    }
    ...
}

Для дальнейшей информации о том, как конфигурации управляются в ZF2 см. ответ Сэма и статью блога .