首頁 > php教程 > php手册 > zendframework 初始化配置

zendframework 初始化配置

WBOY
發布: 2016-08-18 08:57:55
原創
1135 人瀏覽過

https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#environment-specific-system-configuration

有兩個層級的配置:全域和局部也就是係統配置和應用配置。

系統設定:系統設定用來傳遞給Application實例。 Application實例使用這些內容來定位ModuleManager和ServiceManager。

應用程式配置: ModuleManager在載入模組的時候會用ConfigListener合併各個模組的配置。這些配置被稱為應用程式配置。各個模組的配置最終會和config/autoload/下的設定檔合併。

  應用程式配置在傳遞給ServiceManager之前會先傳給EVENT_MERGE_CONFIG事件,這將允許以後進行額外的修改


System Configuration:

  在載入模組之前,我們必須得告訴Application的實例:有哪些模組、這些模組在什麼地方。

  系統配置裡麵包含的欄位:

<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類別(如:ContorllerManager。)提供設定。

  如果想要針對某一個manager類別可以使用對應的模組方法,如:getControllerConfig()等等。 https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#configuration-mapping-table

  

  配置資訊的優先順序:  

各種配置的合併順序:

  1、 module類別裡的各種服務設定方法

  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;

  不會合併;

  允許程式化的操控配置。

  設定資訊傳遞給Application的實例。 ModuleManager依序初始化系統。

Application設定:

  ModuleManager依下列順序合併每一個定義在系統配置裡的module類別:

    Module類別方法裡面定義的服務配置

    Module::getConfig()傳回的配置

  service configuration裡的config_glob_paths定義的檔案設定

  ConfigListener 觸發的EVENT_MERGE_CONFIG事件:ConfigListener何必配置,其他監聽器操控配置(修改)

  最終合併好的配置傳遞給ServiceManager。

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門推薦
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板