寻找管理应用程序配置设置的想法/解决方案

时间:2009-08-30 03:00:03

标签: php configuration

我正在PHP中构建一个MVC框架,需要设置一些默认的配置变量/常量。示例配置变量将是保存日志文件的位置,是否记录查询,Doctrine设置等等。因为我希望开发人员能够以最小的忙乱创建新项目,所以这些配置变量应该具有默认值。但是,要使此框架真正有用,我需要它们能够在项目引导文件中或在控制器或模型中覆盖这些默认值。我很想使用常量,但它们不能被覆盖。我觉得必须有一个我没看到的简单解决方案(也许是设计模式?)。非常感谢任何建议,谢谢。

4 个答案:

答案 0 :(得分:5)

在这种情况下,我可能会:

  • 创建一个处理与配置相关的所有内容的类
    • 该类将包含获取/设置配置选项的方法;无论您的应用需求是什么
    • 如果合适,
    • 还会定义默认值
  • 使用.ini或.xml文件,其中可以重新定义配置值

当实现课程时:

  • 您已拥有默认值
  • 您解析.ini或.xml文件
  • 该配置文件中定义的每个值都用于覆盖类中定义的相应默认值。


一个更复杂但可能更好的解决方案可能是:

  • 仍然具有该配置类,但不使用它来存储任何默认值
  • 有一个.ini或.xml文件来存储默认值
  • 有一个.ini或.xml文件,人们可以在其中覆盖默认值
  • 中定义的值
  • 加载包含默认值的文件,然后加载包含特定值的文件

此解决方案的优点是:

  • 没有存储在PHP类中的配置值
  • 可以覆盖的所有配置选项都已在.ini / .xml文件中定义,这意味着人们只需将一行复制/粘贴到其特定文件中即可覆盖:无需查看PHP上课并思考“如何将其转换为配置文件?”


还有几点说明:

  • 你可能想要使用某种缓存 - 机制,不要在每次请求时重新解析文件
  • Zend_ConfigZend_Config_Ini可能会有所帮助;即使您不使用它们,因为您正在编写自己的框架,您可能想看一看它们的作用 - 如果我没记错的话,Zend_Config_Ini允许在.ini文件中进行层次结构和继承< / LI>

玩得开心!

答案 1 :(得分:2)

我建议使用几个ini文件:default.ini,然后根据需要使用override.ini-s。然后只需使用parse_ini_file()加载它们,然后合并到一个配置array_merge()。快速而简单。

答案 2 :(得分:1)

这是我将使用的设计模式。我会创建一个简单的类来促进它:

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

初始实现都可以使用默认值进行硬编码。但是,稍后您可能会阅读服务器和/或项目特定的配置文件。它可以让您根据需要灵活添加。

(我也注意到php.ini配置似乎有你想要的行为,但我不知道你如何直接利用该系统。)

答案 3 :(得分:1)

这个问题可以有各种各样的答案。我个人的推荐是将值存储到SQLite中,并有一个单独的脚本来访问和更改这些值。其他方式继续阅读。

这非常简单,具体取决于您希望面向对象的方式以及您希望为用户制作内容的简化程度。您的安装说明可以简单地指示用户直接编辑文件。在这种情况下,您可以简单地指示用户直接编辑常量文件。

遵循此路线的大多数应用程序都通过详细信息探索实现它

<?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。