2009-08-30 56 views
3

我正在PHP中構建一個MVC框架,它需要設置一些默認配置變量/常量。示例配置變量將是保存日誌文件的位置,無論是記錄查詢,Doctrine設置等等。因爲我希望開發人員能夠用最少的麻煩創建新項目,所以這些配置變量應該有默認值。但是爲了使這個框架真正有用,我需要它們能夠在項目引導文件中或從控制器或模型中覆蓋這些默認值。我喜歡使用常量,但不能被覆蓋。我覺得好像有一個簡單的解決方案,我只是看不到(也許是設計模式?)。任何意見將不勝感激,謝謝。尋找想法/解決方案來管理應用程序配置設置

回答

5

在這樣的情況下,我可能會:

  • 創建的一切配置相關
    • 該類處理類將包含方法來獲取/組配置選項;無論你的應用程序需要
    • 這也將定義默認值,當合適的
  • 使用.ini文件或.xml文件,其中配置值可以重新定義

當instanciating類:

  • 您已經有默認值
  • 您解析的.ini或.xml文件
  • 在該配置文件中定義的每個值都用於覆蓋類中定義的相應默認值。


溶液中的複雜一點,但也許更好,可能是:

  • 仍然有配置類,但不能用它來存儲任何默認值
  • 有一個。 ini或.xml文件來存儲默認值
  • 有一個.ini或.ini文件。xml文件中,人們可以覆蓋在默認一個
  • 負載包含默認值的文件中定義的值,並且然後將含有特定的人的該溶液

優點之一是:

  • 沒有存儲在PHP類中的配置值
  • 所有可覆蓋的配置選項都已在.ini/.xml文件中定義,這意味着人們只需將行復制/粘貼到其特定文件以覆蓋:no需要去看看PHP類和想一想「如何將其轉換爲配置文件?」


一對夫婦更注意事項:

  • 你可能想使用某種緩存-mecanism的,在每個請求不重新解析文件
  • Zend_ConfigZend_Config_Ini可能是有幫助;即使你不使用的,因爲你正在編寫自己的框架,你可能想看看他們做什麼 - 如果我沒有記錯,Zend_Config_Ini允許的層次結構和繼承的.ini文件

玩得開心!

+1

非常感謝!我有一個跟進問題給你:你能提供一些關於可能的緩存機制的更多信息嗎?我當然不想通過重新解析文件來浪費資源。 – 2009-08-31 00:12:41

+0

嗨。不客氣:-)關於緩存:第一條規則是你現在不應該在意這一點;等到你的應用程序工作。然後,如果有必要,可以將分析的配置數據存儲在文件或內存中(例如使用APC或memcache);請記住,您必須檢查配置文件是否已被修改,以瞭解何時使緩存無效,因此將修改考慮在內。有關更多信息,您可以閱讀http://framework.zend.com/manual/en/zend.cache.frontends.html#zend.cache.frontends的介紹。文件(即使你不使用ZF) – 2009-08-31 04:27:39

1

這是我將使用的設計模式。我會創建一個簡單的類來方便它:

class Configuration { 
    String get($key) {...} 
    String set($key, $value) {...} 
} 

初始實現可能全部使用默認值進行硬編碼。但是,稍後,您可能會讀取服務器和/或項目特定的配置文件。它會讓您靈活地根據需要添加。

(我也注意到,在php.ini配置似乎有你想要的行爲,但我看不出你如何直接利用該系統。)

+0

不應該是'void set(...)'還是返回舊值? – nickf 2009-08-30 09:27:45

2

我建議使用幾個ini文件:一個default.ini,然後儘可能多的override.ini -s,你需要。然後簡單地將它們加載到parse_ini_file()並與array_merge()合併成一個配置。快速簡單。

1

這個問題可以帶有各種各樣的答案。我個人的建議是將值存儲到SQLite中,並有一個單獨的腳本來訪問和更改這些值。換其他方式繼續閱讀。

這很簡單,這取決於您希望如何實現面向對象以及您想爲用戶做些什麼簡化。您的安裝說明可以簡單地指示用戶直接編輯文件。在這種情況下,您可以直接指示用戶直接編輯常量文件。

遵循這條路線的大多數應用程序的細節explination實現它

<?php 
/** 
* Global application configuration 
*/ 
class AWConfig { 

    /** 
    * true or false 
    * If the is set to true debug messages will be added to the application logs 
    */ 
    public $DEBUG_MODE = true; 
    /** 
    * Path to Station database 
    * ex (/homepages/26/3/htdocs/databases/stations.db) 
    */ 
    public $DB_STATION = '/homepages/26/3/htdocs/databases/stations.db'; 
    /** 
    * Path to logs database 
    * ex (/homepages/26/3/htdocs/databases/stations.db) 
    */ 
    public $DB_LOGS = '/homepages/26/d175338743/htdocs/weather/dev/metrics/beta2/databases/metriclogs.db'; 

    /**** DO NOT EDIT BELOW THIS LINE *****/ 
    public $LIST_STATION_LIMIT = 10; 
    public $MAX_COMPARE = 6; 
} 
?> 

如果你想隱藏的用戶比最初的安裝腳本,這些細節將是最好的,會提示用戶的詳細信息,並寫入文件(config.php,config.ini,config.xml或數據庫)他們選擇的設置。然後再編輯一個不同的腳本。好的例子是Joomla CMS。