【问题标题】:How to handle Zend Framework End User INI/Config settings如何处理 Zend Framework 最终用户 INI/Config 设置
【发布时间】:2012-06-16 20:45:51
【问题描述】:

我已经对此进行了搜索和搜索,但我认为我的术语不正确,因为它一直给我 zend 站点的应用程序设置,而不是最终用户的应用程序设置。

我想要一个 config.ini 类型的文件,最终用户可以在其中编辑值。我希望它只是我希望他们看到的设置,并且能够像我一样创建值名称认为对他们有意义。所以会是这样的

[General]
SiteName=MySite
ShowResources=TRUE

[Database]
Server=myServer
databasepath=mydbpath
...

所以我的两个问题。 1. 这种类型的文件叫什么,因为当我搜索应用程序设置时,我得到的 ZF 应用程序设置不是最终用户的(大概)

  1. 处理此类文件的最佳方法是什么?

谢谢

【问题讨论】:

  • 具体说明“最终用户”的含义。我不知道您是在谈论某个使用网络浏览器的随机人,还是尝试安装和运行您正在编写的软件的人。如果是前者,他们不应该编辑 .ini 文件。如果是后者,他们仍然可能不应该编辑 .ini 文件,但如果是,只需创建一个默认文件,让他们编辑它,然后使用 Zend_Config 将值获取到您的应用程序中.
  • 我的最终用户,或者购买我的产品以在他们自己的网站上使用的人。不是网站访问者或通过网络浏览的人。
  • 所以他们正在使用您的 ZF 应用程序结账,并且使用它,他们将只能连接到一个(即他们自己的本地)数据库?
  • 大概是正确的。我不愿让他们编辑任何真正的应用程序设置文件,并且希望他们编辑一些其他无害的 INI 类型文件以获取设置信息。例如。数据库、用户凭据等
  • 啊,好吧,我误解了,相应地编辑了我的答案。

标签: zend-framework config ini


【解决方案1】:
  1. 这是一个 INI 文件,您可以通过 Zend_Config 对其进行读写。
  2. ZF 没有“用户设置”的概念——用户是由您定义的,而不是由框架定义的。

应用程序通常将用户配置存储在数据库中,但这完全取决于您。您可以改为存储 INI 文件的目录。无论哪种方式,您都必须自己进行实施。

编辑:假设您有一个要分发给客户的 ZF 应用程序,并且他们只会使用它连接到一个数据库,这会显着改变事情。 (我以为您最初的意思是让应用程序的一个实例同时连接到多个数据库。)

在您的情况下,我会使用标准的 ZF application/configs/application.ini 文件来进行应用程序的“内部”设置。然后,我将在同一个 application/configs 目录中有一个单独的 local.ini(或其他),其中仅包含您希望客户编辑的那些设置。随应用分发一个框架 local.ini 文件,其中包含说明,如下所示:

; Remove the comment from this line.
;configured = 1

; You need to put your database credentials in here.
db_host = "PUT YOUR DATABASE SERVER NAME HERE"
db_user = "PUT YOUR DATABASE USERNAME HERE"
db_pass = "PUT YOUR DATABASE PASSWORD HERE"

然后只需通过 Zend_Config 加载 local.ini 文件。我还会在您的索引控制器的 init 方法中添加一个检查,以检查您是否配置正确:

$localConfig = Zend_Registry::get('local_config'); // or wherever you put it
if (!$localConfig->configured) {
    $this->_helper->redirector('config', 'error');
}

然后制作一个错误/配置视图,上面写着:

You didn't read the instructions. Go do that now.

请注意,没有什么可以阻止客户编辑他们想要的任何内容,但这会产生逻辑分离,并且更难意外搞砸。

【讨论】:

  • 1.是的,但是我将搜索“最终用户 ini 文件”的 INI 文件类型似乎并没有给出我正在寻找的结果。这种类型的最终用户 INI 文件通常称为什么? 2. 我知道这可能不是 ZF 固有的,但我很好奇处理此类实施的最佳方式。
  • 没有“INI 文件类型”——只有 INI 文件。您没有发现任何与使用 INI 文件进行每用户设置相关的内容,因为没有人这样做。
  • 检查文档,可能的例子对你有用:framework.zend.com/manual/en/…
  • 好的,那么您会将其称为“每个用户”文件吗?如果没有人那样做,他们是用什么方法做的?我不相信我可以将数据库连接信息放入数据库中。人们让他们将其存储在哪里,最好不在实际项目应用程序设置中?还是他们让用户直接编辑这些文件?
【解决方案2】:

在您的引导程序中添加:

protected function _initConfig()
{
    $config = new Zend_Config_Ini(APPLICATION_PATH.'/configs/config.ini');

    Zend_Registry::set('config', $config);

    return $config;
}

用你想要的文件名替换 config.ini。

然后,您可以在应用程序中的任何位置作为应用程序资源或通过注册表 (Zend_Registry::get('config')) 访问此配置对象。因此,要从您的示例中获取 SiteName:

$config = Zend_Registry::get('config');
echo $config->General->SiteName;

对于诸如数据库设置之类的事情,您需要在引导程序中访问它们,以便您可以使用它们来设置其他资源。我建议您不要尝试在 application.ini 中包含数据库设置,而是通过添加另一个引导方法手动设置数据库资源:

protected function _initDb()
{
    $this->bootstrap('config');
    $config = $this->getResource('config');

    $db = Zend_Db::factory('Pdo_Mysql', array(
        'host'     => $config->Database->Server,
        'username' => $config->Database->Username,
        'password' => $config->Database->Password,
        'dbname'   => $config->Database->Dbname
    ));

    return $db;
}

为了进一步解释这一点,$this->bootstrap('config'); 确保首先加载配置资源。 $this->getResource('config'); 返回配置资源(由 _initConfig() 方法创建的资源)。然后它使用来自该对象的数据来创建数据库连接。

【讨论】:

  • 非常感谢蒂姆。这有助于完美地为我布置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2011-12-29
  • 2010-11-22
  • 1970-01-01
  • 2012-08-26
相关资源
最近更新 更多