2009-08-30 58 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。