https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#environment-special-system-configuration
구성에는 글로벌과 로컬, 즉 시스템 구성과 애플리케이션 구성의 두 가지 수준이 있습니다.
시스템 구성: 시스템 구성은 애플리케이션 인스턴스에 전달하는 데 사용됩니다. 애플리케이션 인스턴스는 이러한 콘텐츠를 사용하여 ModuleManager 및 ServiceManager를 찾습니다.
애플리케이션 구성: ModuleManager는 모듈을 로드할 때 ConfigListener를 사용하여 각 모듈의 구성을 병합합니다. 이러한 구성을 애플리케이션 구성이라고 합니다. 각 모듈의 구성은 결국 config/autoload/ 아래의 구성 파일과 병합됩니다.
애플리케이션 구성은 ServiceManager로 전달되기 전에 EVENT_MERGE_CONFIG 이벤트로 전달되므로 향후 추가 수정이 가능합니다.
시스템 구성:
모듈을 로드하기 전에 애플리케이션 인스턴스에 어떤 모듈이 있고 어디에 있는지 알려야 합니다.
시스템 구성에 포함된 필드:
<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>
주석처리된 부분은 선택사항입니다. 시스템 구성은 애플리케이션이 시작되기 전에 로드되므로 일반적으로 매우 작습니다. 모듈 구성 파일에서 service_manager를 재정의할 수 있다는 점을 제외하면 나머지는 재정의할 수 없습니다.
응용 시나리오에 따라 구성 파일을 선택하세요.
때로는 개발 모드에서 하나의 구성을 사용하고 프로덕션 환경에서 다른 구성을 사용하고 싶을 때가 있습니다. apache.conf 또는 .htaccess에 다음 지침을 추가할 수 있습니다.
SetEnv "APP_ENV" "development"
PHP에서 getenv() 또는 $_SERVER[]를 사용하여 서버 환경 변수를 얻은 다음 환경 변수에 따라 구성을 설정합니다.
'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>
모듈 구성:
각 모듈은 자체 구성 파일을 제공할 수 있습니다.
모듈 자체 구성을 반환하려면 getConfig()를 사용하세요. 이 메서드는 moduleManager가 모듈을 로드할 때 자동으로 호출됩니다.
<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는 ServiceManager에서 제공하는 사용 가능한 모든 Manager 클래스(예: ControllerManager...)에 대한 구성을 제공합니다.
특정 관리자 클래스를 대상으로 하려면 getControllerConfig() 등과 같은 해당 모듈 메서드를 사용할 수 있습니다. https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#configuration-mapping-table
구성 정보 우선순위:
다양한 구성의 병합 순서:
1. 모듈 클래스의 다양한 서비스 구성 방법
2. getConfig()에서 반환된 구성은 다른 서비스 구성 방법을 재정의합니다. 참고: 이 방법으로 반환된 구성은 캐시되지 않습니다. 따라서 다른 서비스 구성 방법을 사용하는 것이 가장 좋습니다.
작업 병합을 위한 구성 정보:
모든 구성을 병합하기 전에 ServiceManager에 전달하지 않고 ZendModuleManagerListenerConfigListener가 ZendModuleManagerModuleEvent::EVENT_MERGE_CONFIG 이벤트를 트리거합니다. 이 이벤트를 수신하면 병합된 구성에 대해 작업을 수행할 수 있습니다.
<?<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>
구성 정보 병합 작업 흐름:
시스템 구성:
config/application.config.php에 정의됨
병합되지 않습니다.
프로그래밍 방식으로 제어를 구성할 수 있습니다.
구성 정보가 애플리케이션 인스턴스로 전달됩니다. ModuleManager는 시스템을 순차적으로 초기화합니다.
애플리케이션 구성:
ModuleManager는 시스템 구성에 정의된 각 모듈 클래스를 다음 순서로 병합합니다.
Module 클래스 메소드에 정의된 서비스 구성
Module::getConfig()에 의해 반환된 구성
서비스 구성에서 config_glob_paths로 정의된 파일 설정
ConfigListener에 의해 트리거되는 EVENT_MERGE_CONFIG 이벤트: ConfigListener를 구성해야 하는 이유는 무엇입니까? 다른 리스너가 구성(수정)을 제어합니다.
최종 병합된 구성이 ServiceManager로 전달됩니다.