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

标签 php oop design-patterns factory-pattern

我不想使用已经完成的在 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 的设计模式和用于标签/输入的模式,或者如何将标签和输入组合到一个类中,将其标识为标签或输入或文本区域等...

最佳答案

您可以使用构建器模式。
http://sourcemaking.com/design_patterns/builder/php/1#code

这是一个非常简单的例子。

<?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>Name</label>
<input type="text" name="name" value="" />
<textarea name="message">My message...</textarea>

关于php - 使用哪种设计模式来动态构建表单。 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15484691/

相关文章:

java - 如何改进 Guava Optional 的 mockito 默认行为?

php - php中使用正则表达式的日期格式

c - C中的OOP,实现和错误

php - 为什么 MySQL 连接被阻塞很多连接错误?

python - 类与参数化实例

c++ - 在这种情况下谁应该构建对象?

entity-framework - 为什么DbContext每次都在dispose?

Java设计模式代码解释

PHP多维数组获取逗号分隔的字符串值

php - Laravel 表单数组验证