使用哪种设计模式动态构建表单。PHP

使用哪种设计模式动态构建表单。PHP,php,oop,design-patterns,factory-pattern,Php,Oop,Design Patterns,Factory Pattern,我不想使用已经完成的用PHP构建表单的库。我想用设计模式来写我自己的。我是设计模式的新手,所以我需要知道哪种设计模式最适合在PHP中动态构建表单 例如,到目前为止,我得到了如下结果: class FormBuilder { private $formName; private $formAttributes; //array('ID' => ?, 'Classes' => array(?,?) ... private $formStyle; //Css st

我不想使用已经完成的用PHP构建表单的库。我想用设计模式来写我自己的。我是设计模式的新手,所以我需要知道哪种设计模式最适合在PHP中动态构建表单

例如,到目前为止,我得到了如下结果:

 class FormBuilder {
    private $formName;
    private $formAttributes; //array('ID' => ?, 'Classes' => array(?,?) ...
    private $formStyle; //Css styling of form
    private Label $labels; //a collection of label objects holding bunch labels
    private Input $inputs; //a collection of input objects holding bunch inputs

    /* constructor to initialize everything */


   /* GET/SET methods for each of the above private variables */

   ....

   public function generateHTML() {
      //takes above information and builds HTML and returns html
   }
 }
现在我的问题是每个标签需要一个对象,每个输入需要一个对象。但是,我可能需要为或其他表单元素创建一个对象。最好的方法是使用工厂模式,而不是为每一个类都设置类


任何人都可以建议FormBuilder的设计模式和用于标签/输入的模式,或者如何将标签和输入组合到一个类中,将其标识为标签、输入或文本区域等。

您可以使用Builder模式

这是一个非常简单的例子

<?php

class FormBuilder
{
    private $elements = array();

    public function label($text) {
        $this->elements[] = "<label>$text</label>";
        return $this;
    }   

    public function input($type, $name, $value = '') {
        $this->elements[] = "<input type=\"$type\" name=\"$name\" value=\"$value\" />";
        return $this;
    }   

    public function textarea($name, $value = '') {
        $this->elements[] = "<textarea name=\"$name\">$value</textarea>";
        return $this;
    }   

    public function __toString() {
        return join("\n", $this->elements);
    }   
}

$b = new FormBuilder();
echo $b->label('Name')->input('text', 'name')->textarea('message', 'My message...');

这看起来不错,但对动态表单没有帮助。动态表单,如输入依赖于其他输入元素或用户动态添加新元素

每个元素都应该有单独的类,通过它可以实现动态性。应该有一个由输入类扩展的抽象元素类。此外,还应该有一个字段类,用于保存特定的输入对象及其标签


将很快发送代码……

为什么要对标签和输入使用不同的类?您可以简单地在输入对象上设置一个“label”属性。你需要做的就是在呈现控件及其相关标签时使用该属性。我想将Input、label、TextArea和其他表单元素类合并为一个类,这样我就不必使用bunch类。不知道使用哪种模式,因为您在问题中提到了“构建形式”。最好的设计模式是Builder模式
DomDocument
模式
<label>Name</label>
<input type="text" name="name" value="" />
<textarea name="message">My message...</textarea>