Wie zu verwenden global.php/local.php configs im getConfig() von einem Modul in einer Zend Framework 2 Anwendung?
In einem ZF2-Anwendung ich habe einige cofigs, dass: 1. anders sein muss dependening auf die Umwelt; 2. sind spezifisch für ein konkretes Modul. Ich bin curently es hier beschrieben:
global.php & local.php
return array(
...
'modules' => array(
'Cache' => array(
'ttl' => 1, //1 second
)
)
...
);
Modul-Klassen -
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'],
...
));
},
...
)
);
}
...
}
...
}
Es funktioniert gut, aber ich glaube, dass die Modul-spezifischen Einstellungen zugegriffen werden soll, über eine zentrale Stelle im Modul -- die getConfig()
Methode der Module
Klasse. Wie diese:
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'],
...
));
},
...
)
);
}
...
}
...
}
Das problem ist, dass ich nicht bekommen, wie Sie auf die global.php/local.php configs in der getConfig()
eines Moduls. Wie kann ich es tun?
InformationsquelleAutor automatix | 2013-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Jede einzelne Konfiguration für jedes einzelne Modul geladen werden zusammengeführt in einem einzigen config. Zwar wäre dies:
Den Grund hinter
(global|local).config.php
lediglich der Verwendungszweck. Globale Konfigurationsdateien sollten stets bereitgestellt. Lokale Konfigurations-Dateien sollten jedoch nur eingesetzt werden, wie distributionables, aliaslocal.config.php.dist
.Distributionals werden nicht geladen, egal wo Sie sind Orte. Jedoch gemeinsame Vorstellung von ZF2 zu kopieren distributionables in die
/config/autoload
-Verzeichnis der ZF2-Anwendung und benennen Sie diese umlocal.config.php
Ein Beispiel:
Nun beim veröffentlichen /bereitstellen Ihrer Anwendung, nur
module.config.php
verwendet werden. Wenn jemand will, um die änderung der Konfiguration des Moduls, Sie würde nie touchmodule.config.php
, da diese Datei ständig überschrieben werden, wenn das Modul aktualisiert werden.Jedoch, was die Menschen tun können, ist zu kopieren:
Und ändern Sie die config-Werte, die innerhalb dieser lokalen Konfiguration.
Zu verstehen:
Hoffe das hat ein wenig klarer
Letztlich:
/config/autoload/mymodule.local.php
und überschreiben Ihrettl
mit seiner Entwicklung WertLoadOrder:
Der Letzte interessante Teil, das habe ich völlig vergessen, wäre die Reihenfolge des Ladens der Konfigurationsdateien. Alle Dateien, die zusammengeführt werden, ist dies ein wichtiger Hinweis!
/config/application.config.php
/modules/{module}/config/module.config.php
*/config/autoload/{filename}.php
asterix Es ist eigentlich NICHT
module.config.php
die aufgerufen wird, sondern dieModule
-Klassen-Konfiguration Funktionen. Vor allem diese sind:getConfig()
getServiceConfig()
getViewHelperConfig()
Zend\ModuleManager\Feature\{Funktion}ProviderInterface
Wenn ich verstehe, dieser Teil der
ConfigListener
richtig, danngetConfig()
wird zuerst aufgerufen werden, und alle die specialiced{feature}ProviderInterfaces
überschreibt die Daten vongetConfig()
, aber nehmen Sie das nicht für selbstverständlich, müsste es eine Kontrolle!local.%module%.php.dist
(ein Beispiel fürlocal.%module%.php
) undmodule.config.php
(default-Einstellungen) in/module/Cache/config
undlocal.%module%.php
(real Einstellungen für die aktuelle Umgebung) in/config/autoload
.local.%module%.php
- Dateien zusammengeführt werden, "automatisch" (Magie?) der/config/autoload/local.php
und hat eine höhere prioroty alsmodule.config.php
. 1. Verstehe ich das richtig? 2. Was ist mit dem Schlüssel? Wenn dielocal.%module%.php
Dateien sind direkt zusammengeführt, umlocal.php
sind, wie können Konflikte vermieden werden? 3. Wie kann/soll ich auf die Einstellungen zugreifen?Siehe aktualisierte Antwort
Sam: ich Danke Ihnen sehr für Ihre ausführliche Antwort und das update. Sorry, ich kann immer noch nicht verstehen, wie das laden der
/autoload/local.{modulename}.php
- Dateien. Ich habe/autoload/local.cache.php
für mein ModulCache
, aber es wird nicht geladen. Können Sie bitte ein elementares Beispiel, wie Sie die Einstellungmysetting
(in allen möglichen relevanten Dateien in das Modul und die Anwendung config-Ordner) für ein ModulMyModule
und wie Sie Zugriff auf diese Einstellung, die von Ihrem Modul-Klasse?Versuchen
cache.local.php
😉Sie sind eigentlich nicht für den Zugriff auf andere Module Einstellung Ihrer
Module#getConfig()
. Wenn Sie verlassen sich auf andere Konfiguration, die NUR für service-Zwecke. Ergo würden Sie verlassen sich aufModule#getServiceConfig()
und innerhalb der Fabriken haben Sie Zugriff auf dieServiceManager
InformationsquelleAutor Sam
Sie sind eigentlich nicht für den Zugriff auf andere Module Einstellung Ihrer
Module#getConfig()
. Wenn Sie verlassen sich auf andere Konfiguration, die NUR für service-Zwecke. Ergo würden Sie verlassen sich aufModule#getServiceConfig()
und innerhalb der Fabriken haben Sie Zugriff auf dieServiceManager
und Zugriff auf Ihre configs mit$serviceManager->get('config');
. (siehe Sam ' s Kommentar)Den laden, um von den configs ist standardmäßig:
/config/application.config.php
, das ist die erste config Datei, nicht für die Modul-configs; hier ist der Dateinamen-Muster für die config-Dateien zu laden definiert ('config_glob_paths' => array('config/autoload/{,*.}{global,local}.php')
).{ModuleNamespace}\Module#getConfig()
(z.B.Cache\Module#getConfig()
), die per Konvention sollte der laden seine/module/{ModuleNamespace}/config/module.config.php
;/config/autoload/global.php
sollte das nicht enthalten modulspezifische Konfigurationen (siehe unten);/config/autoload/local.php
enthält der Umgebung Einstellungen sollten auch nicht enthalten modulspezifische Konfigurationen (siehe unten); es sollten nicht versioniert werden/bereitgestellt;/config/autoload/{ModuleNamespaceLowerCased}.local.php
(z.B.cache.local.php
), enthält nur die Modul UND der Umgebung Einstellungen und sollten nicht versioniert werden/;Für die
Cache
Modul oben können die folgenden config-Dateien:/module/Cache/config/module.config.php
-- eine vollständige Gruppe von Modul-Konfigurationen; geladenCache\Module#getConfig()
/module/Cache/config/cache.local.php.dist
- ein Beispiel für/config/autoload/cache.local.php
/config/autoload/cache.local.php
-- Umwelt-spezifisches Modul-configsDie Einstellung
ttl
zugegriffen werden kann von jedem Ort aus, wo hat man Zugang zu den Service-Locator. Zum Beispiel im factory-Methoden derCache\Module#getServiceConfig()
Für weitere Informationen darüber, wie configs verwaltet werden, in ZF2 siehe Sam ' s Antwort und blog-Artikel.
Es ist eine sehr gute theoretische Artikel (+1), aber es mir nicht direkt die Antwort auf meine Frage. Trotzdem, es hat mir geholfen zu verstehen, wie configs arbeiten, und um eine Antwort zu finden. Habe ich es hier gepostet und zugelassen / gekennzeichnet als "gültige Antwort".
InformationsquelleAutor automatix