代码之家  ›  专栏  ›  技术社区  ›  Jakob

如何最好地从配置文件创建对象?

  •  1
  • Jakob  · 技术社区  · 14 年前

    我有一个PHP类集合,可以使用构造函数传统地实例化这些类。现在,我想添加使用yaml配置文件实例化这些对象的能力。

    以下是描述Web表单的配置文件示例:

    title: Contact
    fields:
        message:
            type: text
            required: true
        topic:
            type: dropdown
            options: ["HTML", "CSS", "PHP"]
    

    这将导致一个表单对象具有两个对应的字段对象。换句话说,配置文件有时描述包含其他对象的对象。

    我不希望简单地从yaml键/值对映射到php属性,因为我希望在配置文件中允许使用速记语法。例如,我想缩写一些属性名,还可以键入类似 default: today ,其中“today”不解释为字符串文字,而是转换为当前时间戳。

    由于许多类都是子类,所以我正在寻找一个解决方案,它也允许我以某种方式从超类“继承”配置逻辑。

    我想避免修改现有的类,但是如果它允许一个更简单的解决方案,我愿意这样做。 再想一想,我并不介意修改现有的类;我只是对最好的解决方案感兴趣。

    如何以这种方式最好地从配置文件创建对象?

    5 回复  |  直到 14 年前
        1
  •  3
  •   Martin Schuhfuß    14 年前

    您可以采用以下方法:

    从配置文件填充的每个模型类都应该实现一个接口,例如,一个方法 fromArray($data) .

    在顶层,您知道要创建的对象(表单)的类型。此对象将被显示,并且配置文件中的数据将传递给FromArray方法。对象然后遍历配置数据,并“知道”如何处理每个条目。

    对于“fields”数组的每个元素,它随后可以将数据传递给子对象, 它们自己能够正确地遍历和处理配置(包括以特殊方式为接受日期的任何字段解释“今天”)。

    只需将创建对象的责任分解为知道如何处理此类对象的特殊方法。

        2
  •  1
  •   Community CDub    8 年前

    我要做的第一件事是看看这个轮子是否已经被人发明了——这可能涉及到查看这里提供的一些ORM建议: Good PHP ORM Library?

    编辑:或者更有用的是,在这种情况下,看看Yaml Symfony: http://components.symfony-project.org/yaml/ -这还允许您在配置文件中嵌入PHP,配置文件中也应该包含简短的字段名。

    除此之外,我不会详细介绍自己实现事物的方法,因为有很多不同的方法可以选择,而不是自己实现它们,我不想让您出错,但我建议如果您使用这样的速记语法,您将需要某种方法来标记它是速记语法-c奥丁 default: today 更容易出错 default : %%today%% 或其他更专业的加价。

        3
  •  1
  •   Justin    14 年前

    我自己写的PHP不多,但是如果你在symfony的yaml的帮助下自己写的话,我可以看到类似的东西在工作。你可以用 PHP Reflection 类获取对象和子对象的所有属性,然后使用 Symfony yaml代码将yaml映射到数组,然后将数组映射到属性。在将数组映射到PHP对象属性的代码中,您可以查找诸如“今天”之类的特殊内容,并让它们执行特殊的操作。

    您可能需要一种方法来标记属性,以对不同的输入做出特定的反应。我不知道它在PHP中是否可行,但是在.NET中,您可以用属性类标记属性,让属性知道如何做特殊的事情。

        4
  •  0
  •   codez    14 年前

    用PHP编写配置。

    $ContactConfig=array(
      $title='Contact',
      $fields=array(
        'message'=>array(
          'type'=>'text',
          'required'=>true
        ),
        'topic'=>array(
          'type'=>'dropdown',
          'options'=>array('HTML','CSS','PHP')
        )
      )
    );
    
        5
  •  0
  •   bcosca    14 年前

    编写一个PHP代码生成器,它基本上将yaml配置转换为PHP代码。这样做时,操作码缓存(apc、eaccelerator、xcache等)将使脚本在运行时更高效,而不是php每次加载yaml文件时都必须解释它。