https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#environment-special-system-configuration
Es gibt zwei Konfigurationsebenen: global und lokal, also Systemkonfiguration und Anwendungskonfiguration.
Systemkonfiguration: Die Systemkonfiguration wird zur Übergabe an die Anwendungsinstanz verwendet. Die Anwendungsinstanz verwendet diese Inhalte, um den ModuleManager und den ServiceManager zu finden.
Anwendungskonfiguration: ModuleManager verwendet ConfigListener, um die Konfigurationen jedes Moduls beim Laden von Modulen zusammenzuführen. Diese Konfigurationen werden Anwendungskonfigurationen genannt. Die Konfiguration jedes Moduls wird schließlich mit der Konfigurationsdatei unter config/autoload/ zusammengeführt.
Die Anwendungskonfiguration wird an das Ereignis EVENT_MERGE_CONFIG übergeben, bevor sie an den ServiceManager übergeben wird, wodurch in Zukunft weitere Änderungen möglich sind
Systemkonfiguration:
Bevor wir ein Modul laden, müssen wir der Anwendungsinstanz mitteilen, welche Module es gibt und wo sie sich befinden.
In der Systemkonfiguration enthaltene Felder:
<span style="color: #008000;">//</span><span style="color: #008000;">包含整个应用中用到的模块,一般是模块的命名空间。</span> 'modules' =><span style="color: #000000;"> [ </span>'Application',<span style="color: #000000;"> ]</span>, <span style="color: #008000;">//</span><span style="color: #008000;">module_listener_options留给ModuleManager的监听器使用(Zend\ModuleManager\Listener\ConfigListener</span> 'module_listener_options' =><span style="color: #000000;"> [ </span><span style="color: #008000;">//</span><span style="color: #008000;">指明了模块的存储位置,一般在/module和/vendor两个目录下。</span> 'module_paths' =><span style="color: #000000;"> [ </span>'./module', './vendor', <span style="color: #008000;">//</span><span style="color: #008000;">也可以使用string key </span> 'module_namespace' => 'path_to_the_module's_Module_Class'<span style="color: #000000;"> ], //模块加载之后的全局配置文件的路径。可以使用GLOB_BRACE标记:http://cn2.php.net/glob </span>'config_glob_paths'<span style="color: #000000;"> => [ </span>'config/autoload/{{,*.}<span style="color: #0000ff;">global</span>,{,*.local}.php'<span style="color: #000000;">, ], //是否使用configuration cache。如果使用配置将会被缓存用于后续请求 // </span>'config_cache_enabled'<span style="color: #000000;"> => $booleanValue, //创建配置缓存文件的名字 // </span>'config_cache_key'<span style="color: #000000;"> => $stringKey, //是否使用模块类映射缓存。 // </span>'module_map_cache_enabled'<span style="color: #000000;"> => $booleanValue, //缓存文件名 // </span>'module_map_cache_key'<span style="color: #000000;"> => $stringKey, //缓存文件的路径 //</span>'cache_dir'<span style="color: #000000;"> => $stringPath, //是否检查模块之间的依赖,默认检查。如果某个模块的抵赖模块没有加载,那这个模块也不会使用 //</span>'check_dependencies'<span style="color: #000000;"> => true, ], //以上为</span>'<span style="color: #000000;">module_listener_options内容。 </span><span style="color: #008000;">//</span><span style="color: #008000;">用来创建自己的service manager //'service_listener_options' => [ // [ // 'service_manager' => $stringServiceManagerName, // 'config_key' => $stringConfigKey, // 'interface' => $stringOptionalInterface, // 'method' => $stringRequiredMethodName, // ],</span> ], <span style="color: #008000;">//</span><span style="color: #008000;">用来初始化ServiceManager的初始配置。 //必须和Zend\ServiceManager\Config兼容 //'service_manager' => [],</span>
Die kommentierten Teile sind optional. Die Systemkonfiguration wird vor dem Start der Anwendung geladen und ist daher im Allgemeinen sehr klein. Außer service_manager kann in der Modulkonfigurationsdatei überschrieben werden, der Rest ist nicht überschreibbar.
Wählen Sie die Konfigurationsdatei entsprechend dem Anwendungsszenario aus:
Manchmal möchten wir eine Konfiguration im Entwicklungsmodus und eine andere Konfiguration in der Produktionsumgebung verwenden. Wir können die folgenden Anweisungen in apache.conf oder .htaccess hinzufügen:
SetEnv "APP_ENV" "development"
Verwenden Sie getenv() oder $_SERVER[] in PHP, um die Serverumgebungsvariablen abzurufen, und legen Sie dann die Konfiguration entsprechend den Umgebungsvariablen fest.
'config_glob_paths' =><span style="color: #000000;"> [ </span><span style="color: #008080;">sprintf</span>('config/autoload/{,*.}{global,%s,local}.php', <span style="color: #800080;">$env</span><span style="color: #000000;">) ]</span>
Modulkonfiguration:
Jedes Modul kann seine eigene Konfigurationsdatei bereitstellen.
Verwenden Sie getConfig(), um die eigene Konfiguration des Moduls zurückzugeben. Diese Methode wird automatisch aufgerufen, wenn moduleManager das Modul lädt.
<span style="color: #008000;">//</span><span style="color: #008000;">File:module.php</span> <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span><span style="color: #000000;"> getConfig() { </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">include</span> __DIR__ . '/config/module.php'<span style="color: #000000;">; }</span>
getConfig stellt die Konfiguration für alle verfügbaren Manager-Klassen bereit, die von ServiceManager bereitgestellt werden (z. B. ControllerManager...).
Wenn Sie auf eine bestimmte Managerklasse abzielen möchten, können Sie die entsprechende Modulmethode verwenden, z. B. getControllerConfig() usw. https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#configuration-mapping-table
Priorität der Konfigurationsinformationen:
Reihenfolge verschiedener Konfigurationen zusammenführen:
1. Verschiedene Dienstkonfigurationsmethoden in der Modulklasse
2. Die von getConfig() zurückgegebene Konfiguration überschreibt andere Dienstkonfigurationsmethoden. Hinweis: Die von dieser Methode zurückgegebene Konfiguration wird nicht zwischengespeichert (daher ist es am besten, andere Dienstkonfigurationsmethoden zu verwenden).
Informationen zur Betriebszusammenführungskonfiguration:
Bevor alle Konfigurationen zusammengeführt, aber nicht an ServiceManager übergeben werden, löst ZendModuleManagerListenerConfigListener das ZendModuleManagerModuleEvent::EVENT_MERGE_CONFIG-Ereignis aus. Durch Abhören dieses Ereignisses können Sie die zusammengeführte Konfiguration bearbeiten.
<?<span style="color: #000000;">php namespace FOO; </span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\ModuleManager\ModuleEvent; </span><span style="color: #0000ff;">use</span><span style="color: #000000;"> Zend\ModuleManager\ModuleManager; </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Module { </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> init(ModuleManager <span style="color: #800080;">$moduleManager</span><span style="color: #000000;">) { </span><span style="color: #800080;">$events</span> = <span style="color: #800080;">$moduleManager</span>-><span style="color: #000000;">getEventManager(); </span><span style="color: #800080;">$events</span>->attach(ModuleEvent::EVENT_MERGE_CONFIG, <span style="color: #0000ff;">array</span>(<span style="color: #800080;">$this</span>, 'onMergeConfig'<span style="color: #000000;">)); } </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">function</span> onMergeConfig(ModuleEvent <span style="color: #800080;">$e</span><span style="color: #000000;">) { </span><span style="color: #800080;">$configListener</span> = <span style="color: #800080;">$e</span>-><span style="color: #000000;">getConfigListener(); </span><span style="color: #800080;">$config</span> = <span style="color: #800080;">$configListener</span>->getMergedConfig(<span style="color: #0000ff;">false</span><span style="color: #000000;">); </span><span style="color: #0000ff;">if</span> (<span style="color: #0000ff;">isset</span>(<span style="color: #800080;">$config</span>['some_key'<span style="color: #000000;">])) { </span><span style="color: #0000ff;">unset</span>(<span style="color: #800080;">$config</span>['some_key'<span style="color: #000000;">]); } </span><span style="color: #800080;">$configListener</span>->setMergedConfig(<span style="color: #800080;">$config</span><span style="color: #000000;">); } }</span>
Workflow zum Zusammenführen von Konfigurationsinformationen:
Systemkonfiguration:
Definiert in config/application.config.php
Wird nicht zusammengeführt
Ermöglicht die programmgesteuerte Steuerungskonfiguration.
Konfigurationsinformationen werden an die Anwendungsinstanz übergeben. ModuleManager initialisiert das System sequentiell.
Anwendungskonfiguration:
ModuleManager führt jede in der Systemkonfiguration definierte Modulklasse in der folgenden Reihenfolge zusammen:
Dienstkonfiguration definiert in der Modulklassenmethode
Von Module::getConfig() zurückgegebene Konfiguration
Dateieinstellungen, die durch config_glob_paths in der Dienstkonfiguration definiert werden
EVENT_MERGE_CONFIG-Ereignis, ausgelöst durch ConfigListener: Warum muss ConfigListener konfiguriert werden? Andere Listener steuern die Konfiguration (Änderung)
Die endgültige zusammengeführte Konfiguration wird an ServiceManager übergeben.