Comment utiliser l'global.php/local.php les configs dans le getConfig() d'un module dans une Zend Framework 2 de la demande?
Dans un ZF2 application j'ai quelques cofigs, que: 1. doivent être différentes dependening sur l'environnement; 2. sont spécifiques à un module béton. Je suis actuellement à l'utiliser comme ici décrit:
global.php & local.php
return array(
...
'modules' => array(
'Cache' => array(
'ttl' => 1, //1 second
)
)
...
);
De classe de Module
Module {
...
public function getServiceConfig() {
try {
return array (
'factories' => array(
'Zend\Cache\Adapter\MemcachedOptions' => function ($serviceManager) {
return new MemcachedOptions(array(
'ttl' => $this->getConfig()['modules']['Cache']['ttl'],
...
));
},
...
)
);
}
...
}
...
}
Ça fonctionne, mais je crois, que le module des paramètres spécifiques devraient être accessibles sur une place centrale dans le module -- le getConfig()
méthode de la Module
classe. Comme ceci:
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')['modules']['Cache']['ttl'],
...
));
},
...
)
);
}
...
}
...
}
Le problème, c'est que je ne comprends pas comment accéder à la global.php/local.php les configs dans le getConfig()
d'un module. Comment puis-je le faire?
Vous devez vous connecter pour publier un commentaire.
Chaque configuration de chaque Module chargé seront fusionnés en un seul fichier de configuration. À savoir, ce serait:
La raison derrière
(global|local).config.php
est simplement pour but de l'utilisation. Fichiers de configuration globale doit toujours être déployé. Fichiers de configuration locaux cependant ne devraient être déployés en tant que distributionables, aliaslocal.config.php.dist
.Distributionals ne sera pas chargé, peu importe où ils sont des lieux. Cependant notion commune de ZF2 est de copier le distributionables dans le
/config/autoload
-répertoire du ZF2 de l'Application et de les renommer pourlocal.config.php
Un exemple:
Maintenant, lorsque vous publiez /déployez votre application, seulement
module.config.php
sera utilisé. Si quelqu'un veut modifier la configuration de votre Module, ils jamais touchmodule.config.php
, comme ce fichier n'auront de cesse d'être écrasé lors de votre module sera mis à jour.Cependant, ce que les gens peuvent faire est de copier:
Et de changer la configuration des valeurs à l'intérieur de cette configuration locale.
À comprendre:
Espère que ça a été un peu plus clair
En fin de compte:
/config/autoload/mymodule.local.php
et remplacer votrettl
avec le développement de la valeurLoadOrder:
La dernière partie intéressante, que j'ai complètement oublié, serait de l'ordre de chargement des fichiers de configuration. Comme tous les fichiers sont fusionnés, ce qui est important de noter!
/config/application.config.php
/modules/{module}/config/module.config.php
*/config/autoload/{filename}.php
astérix Il est en fait PAS
module.config.php
ce qui est appelé, mais plutôt laModule
-classes de fonctions de configuration. Principalement, ce sont:getConfig()
getServiceConfig()
getViewHelperConfig()
Zend\ModuleManager\Fonctionnalité\{fonction}ProviderInterface
Si je comprends cette partie de la
ConfigListener
correctement, puisgetConfig()
sera appelé en premier et toutes les specialiced{feature}ProviderInterfaces
va écraser les données degetConfig()
, mais ne prenez pas cela pour acquis, il aurait besoin d'un check!local.%module%.php.dist
(un exemple pourlocal.%module%.php
) etmodule.config.php
(paramètres par défaut) dans/module/Cache/config
etlocal.%module%.php
(réel les paramètres actuels de l'environnement) dans/config/autoload
.local.%module%.php
fichiers sont fusionnés "automatiquement" (magie?) à la/config/autoload/local.php
et a une plus grande prioroty quemodule.config.php
. 1. Dois-je comprendre de ce droit? 2. Ce sur les touches? Si lelocal.%module%.php
fichiers sont directement fusionné pourlocal.php
, comment les conflits sont évités? 3. Comment pouvez-vous/devriez-je accéder aux paramètres?/autoload/local.{modulename}.php
fichiers. J'ai créé/autoload/local.cache.php
pour mon moduleCache
, mais il n'est pas chargé. Pouvez-vous s'il vous plaît poster un exemple élémentaire, comment vous définissez le paramètremysetting
(dans tous les fichiers pertinents dans le module et l'application dossier config) pour un moduleMyModule
et comment vous pouvez accéder à ce paramètre à partir de votre module de classe?cache.local.php
😉ConfigListener
bien [...]": j'ai juste une mise au point d'un module de simplement fixer un point d'arrêt dans chacun de ses config méthodes (ce module implémente seulement trois config des interfaces). L'ordre de chargement est:getAutoloaderConfig()
,getConfig()
,getServiceConfig()
.$mySetting = $this->getConfig()['mySetting']
et il ne peut pas fonctionner, car lagetConfig()
renvoie simplement les configs de{module root directory} . '/config/module.config.php'
.$this->getConfig()
? La configuration globale sera récupérée à partir de la ServiceManager (c'est à dire à l'intérieur d'un contrôleur via$this->getServiceLocator()->get('config');
ou iirc ce dont vous avez besoin serait$serviceManager->get('config')
MyModule#getConfig()
(et à d'autres endroits, où je ne peux pas accéder à la ServiceLocator). Oui, je peux accéder aux paramètres de$serviceManager->get('Config')['myConfig']
. Mais je n'ai pas l'accès à la ServiceLocator de partout. E. g. deMyModule#getConfig()
ou une table de mappeur de classe ou de manière.Module#getConfig()
. Si vous comptez sur les autres de configuration, qui PEUT ÊTRE UNIQUEMENT à des fins de service. Ergo vous seriez compter surModule#getServiceConfig()
et à l'intérieur des usines, vous avez accès àServiceManager
Vous n'êtes pas censé avoir accès à d'autres Modules dans votre
Module#getConfig()
. Si vous comptez sur les autres de configuration, qui PEUT ÊTRE UNIQUEMENT à des fins de service. Ergo vous seriez compter surModule#getServiceConfig()
et à l'intérieur des usines, vous avez accès àServiceManager
et d'accéder à vos configs avec$serviceManager->get('config');
. (voir Sam commentaire)L'ordre de chargement des configurations par défaut:
/config/application.config.php
, qui est l'initiale du fichier de configuration; pas pour le module configs; ici est le modèle de nom de fichier pour les fichiers de configuration à charger défini ('config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
).{ModuleNamespace}\Module#getConfig()
(par exempleCache\Module#getConfig()
), qui, par convention, doit se charger de son/module/{ModuleNamespace}/config/module.config.php
;/config/autoload/global.php
, qui ne devrait pas contenir n'importe quel module spécifique configs (voir ci-dessous);/config/autoload/local.php
, qui contient environnement spécifique paramètres ne doivent pas contenir de module spécifique configs (voir ci-dessous); il ne doit pas versionné/déployées;/config/autoload/{ModuleNamespaceLowerCased}.local.php
(par exemplecache.local.php
), qui contient uniquement le module ET de l'environnement spécifique paramètres et ne doit pas être versionné/;Pour la
Cache
module ci-dessus il peut y avoir des fichiers de configuration suivants:/module/Cache/config/module.config.php
un ensemble complet de module configs; chargé parCache\Module#getConfig()
/module/Cache/config/cache.local.php.dist
, un exemple pour/config/autoload/cache.local.php
/config/autoload/cache.local.php
-- environnement module spécifique configsLa mise
ttl
peut être consulté à partir de n'importe quel endroit, où l'on a accès au Service Locator. Par exemple, dans l'usine de méthodes deCache\Module#getServiceConfig()
Pour de plus amples informations sur la façon de configs sont gérés dans ZF2 voir Sam réponse et article du blog.