zendframework 初始化配置

来源:http://www.cnblogs.com/san-fu-su/archive/2016/08/17/5778423.html
-Advertisement-
Play Games

https://framework.zend.com/manual/2.4/en/tutorials/config.advanced.html#environment-specific-system-configuration 有兩個級別的配置:全局和局部也就是系統配置和應用配置。 系統配置:系統配 ...


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的實例:有哪些模塊、這些模塊在什麼地方。

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

//包含整個應用中用到的模塊,一般是模塊的命名空間。
'modules' => [
    'Application',
],

//module_listener_options留給ModuleManager的監聽器使用(Zend\ModuleManager\Listener\ConfigListener
'module_listener_options' => [

    //指明瞭模塊的存儲位置,一般在/module和/vendor兩個目錄下。
    'module_paths' => [
        './module',
        './vendor',
    //也可以使用string key  
        'module_namespace' => 'path_to_the_module's_Module_Class'
    ],

    //模塊載入之後的全局配置文件的路徑。可以使用GLOB_BRACE標記:http://cn2.php.net/glob
    'config_glob_paths' => [
        'config/autoload/{{,*.}global,{,*.local}.php',
    ],

    //是否使用configuration cache。如果使用配置將會被緩存用於後續請求
//    'config_cache_enabled' => $booleanValue,
    //創建配置緩存文件的名字
//    'config_cache_key' => $stringKey,
    
    //是否使用模塊類映射緩存。
//    'module_map_cache_enabled' => $booleanValue,
    //緩存文件名
//    'module_map_cache_key' => $stringKey,

    //緩存文件的路徑
    //'cache_dir' => $stringPath,

    //是否檢查模塊之間的依賴,預設檢查。如果某個模塊的抵賴模塊沒有載入,那這個模塊也不會使用
    //'check_dependencies' => true,
], //以上為'module_listener_options內容。

//用來創建自己的service manager
//'service_listener_options' => [
//    [
//        'service_manager' => $stringServiceManagerName,
//        'config_key'           => $stringConfigKey,
//        'interface'              => $stringOptionalInterface,
//        'method'                => $stringRequiredMethodName,
//    ],
],

//用來初始化ServiceManager的初始配置。
//必須和Zend\ServiceManager\Config相容
//'service_manager' => [],

 加註釋的部分都是可選的。系統配置是應用啟動之前載入的,所以一般都很小。除了service_manager可以在模塊配置文件中重載,其餘的都是不可重寫的。

 

根據應用場景選擇配置文件:

  有時候我們想在開發模式下使用一個配置,正式環境下使用另一個配置。我們可以在apache.conf或者.htaccess裡面添加如下指令:

SetEnv "APP_ENV" "development"

 

  在PHP中使用getenv()或者$_SERVER[]來獲取伺服器環境變數,然後根據環境變數設置配置。

'config_glob_paths' => [
    sprintf('config/autoload/{,*.}{global,%s,local}.php', $env)
]

 

 

模塊配置:

  每一個模塊都可以提供自己的配置文件。

  使用getConfig()返回模塊自己的配置,,這個方法會被moduleManager載入模塊的時候自動調用。

//File:module.php

public function getConfig()
{
    return include __DIR__ . '/config/module.php';
}

 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之前,Zend\ModuleManager\Listener\ConfigListener會觸發Zend\ModuleManager\ModuleEvent::EVENT_MERGE_CONFIG事件。通過監聽這個事件你可以對已經合併的配置進行操作。

<?php
namespace FOO;
use Zend\ModuleManager\ModuleEvent;
use Zend\ModuleManager\ModuleManager;

class Module
{
    public function init(ModuleManager $moduleManager)
    {
        $events = $moduleManager->getEventManager();
        $events->attach(ModuleEvent::EVENT_MERGE_CONFIG, array($this, 'onMergeConfig'));
    }
    
    public function onMergeConfig(ModuleEvent $e)
    {
        $configListener = $e->getConfigListener();
        $config = $configListener->getMergedConfig(false);
        
        if (isset($config['some_key'])) {     
            unset($config['some_key']);
        }
        
        $configListener->setMergedConfig($config);
    }
}

 

 

 

 配置信息合併的工作流程:

系統配置:

  定義在config/application.config.php;

  不會合併;

  允許程式化的操控配置。

  配置信息傳遞給Application的實例。ModuleManager按順序初始化系統。

Application配置:

  ModuleManager按以下順序合併每一個定義在系統配置里的module類:

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

    Module::getConfig()返回的配置

  service configuration里的config_glob_paths定義的文件設置

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

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 有兩個功能變數名稱指向我的網站,其中一個功能變數名稱訪問我的網站的話就可以看到日期控制項 另一個功能變數名稱訪問我的網站不能看到日期控制項, 在EF中使用日期控制項,瀏覽器審查元素後看到,報這個錯誤“Both must set "document.domain" to the same value to allow access ...
  • 記錄各種級別的日誌是所有應用不可或缺的功能。關於日誌記錄的實現,我們有太多第三方框架可供選擇,比如Log4Net、NLog、Loggr和Serilog 等,當然我們還可以選擇微軟原生的診斷框架(相關API定義在命名空間“System.Diagnostics”中)實現對日誌的記錄。.NET Core提... ...
  • https://openxmlexporttoexcel.codeplex.com/ 引用: ...
  • 本文版權歸博客園和作者個人所有,轉載和爬蟲請註明原文地址 :博客園蝸牛NoSql系列地址 http://www.cnblogs.com/tdws/tag/NoSql/ Redis命令拾遺之散列類型 Redis散列類型,Hash,適合存儲對象。上一篇文章字元串類型提到字元串不適合一段整體的數據,而不是 ...
  • 一直以來對於值類型和引用類型都只是一個模糊的概念,趁最近有空深入理解了下。 先說說值類型,在msdn上是這樣介紹值類型的。 意思就是值類型直接包含值。 變數引用的位置就是值所在記憶體中實際存儲的位置,所以捏,假如你將一個原始變數的值賦給另一個變數,會在新變數的位置創建原始變數的值的一個記憶體副本。兩個變 ...
  • 前提:新開項目,需要在 Git@OSC 建立版本庫管理。 1.當然是先在Git@OSC上創建倉庫,拿到Git@OSC倉庫的HTTP連接 https://git.oschina.net/*****/***.git 2.如果我們的本地項目是非git項目,那我們要先把它變成git項目 在 idea 中 V ...
  • 昨天下班後,在電腦安裝phpstorm。xampp安裝正常,但是在phpstorm上直接打開網站文件一直報錯,一直報錯502.我感覺好奇快,怎麼會報錯呢。後面我用hbuild打開文件,在瀏覽器顯示正常。我才註意到:PhpStorm中,open in browser路徑一直是錯誤的。一直是http:/ ...
  • 看到博客園一位博友寫的面試問題,其中一題是 Integer a = 1; Integer b = 1 ; (a == b)?true :false; 當時我一看,這不是明顯的true 嘛, 看到評論討論才知道,對於Integer值比較 有範圍規定 。平時都是用equals做比較判斷,簡單省事。沒註意 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...