【问题标题】:PHP/JS Form Class - Array vs OOPHP/JS 表单类 - 数组与 OO
【发布时间】:2011-04-01 00:02:43
【问题描述】:

我最近开始研究一个 PHP/JS 表单类,它还将包括一个 SQL 表单构建器(例如,从 sql 和自动插入/更新构建简单表单)。

我尝试了几个类(zend_form、clonefish、PHP Form Builder Class、phorms 等),但还没有找到一个简单、可定制和完整的完整解决方案(服务器端和客户端验证,涵盖所有简单的 html 元素和大量 dhtml 元素:排序、所见即所得、多文件上传、日期选择器、ajax 验证等)

我的问题是为什么有些“类”通过数组实现元素,而另一些通过适当的 OO 类调用实现元素。

例如。 Clonefish(流行的商业php类):

    $config = Array( 

  'username' => Array( 
    'type'           => 'inputText', 
    'displayname'    => 'Username', 
    validation     => Array( 
      Array(  
        'type'    => 'string', 
        'minimum' => 5, 
        'maximum' => 15, 
      ), 
    ), 
  ));

$clonefish = new clonefish( 'loginform', 'test.php', 'POST' ); 

$clonefish->addElements( $config, $_POST );

然后是其他人,例如。 Zend_Form

$form = new Zend_Form;
$username = new Zend_Form_Element_Text('username');
$username->addValidator(new Zend_Validate_Alnum());
$form->addElement($username);

我意识到 Zend_Form 可以通过类似于 clonefish 的数组传入元素,但为什么要这样做?

有什么好处吗?这似乎使事情变得更加复杂,尤其是在使用像 Komodo 这样的适当 IDE 时。

任何想法都将不胜感激,因为我不想走得太远,并意识到使用数组添加元素有很大的好处(尽管这不是一项需要添加的任务)。

干杯

【问题讨论】:

    标签: php javascript oop forms


    【解决方案1】:

    为什么要使用对象?因为它们是更复杂的类型。考虑以下示例(我从未使用过 Zend_Form,所以我什至不知道它的架构):

    class MySuperAlnumValidator extends Zend_Validate_Alnum {
         protected $forbiddenWords = array();
    
         public function addForbiddenWord($word) {
             $this->forbiddenWords[] = $word;
         } 
    
         // Override Zend_Value_Alnum::validate() - I don't know whether such a method even exists 
         // but you know what's the point
         public function validate() {
              parent::validate();
    
              if (in_array($this->value, $this->forbiddenWords) {
                  throw new Exception('Invalid value.');
              }
    
              return $this->value;
         }
    }
    
    // -----------------------
    
    $validator = new MySuperAlnumValidator();
    $validator->addForbiddenWord('admin');
    $validator->addForbiddenWord('administrator');
    
    $username->addValidator($validator);
    

    这只是一个简单的示例,但是当您开始编写更复杂的验证器/表单字段/等时。那么原则上,对象是唯一有意义的工具。

    【讨论】:

    • 我想我会坚持构建一个完整的OO解决方案。正如您所概述的,它是处理表单复杂性的最佳方式。如果需要,它将允许开发人员在框外做一些事情,但会覆盖。
    【解决方案2】:

    我的问题是为什么有些“类”通过数组实现元素,而另一些通过适当的 OO 类调用实现元素。

    为了方便。它不那么冗长,感觉不像是编码,更像是配置,而且您不需要对 API 有深入的了解。

    顺便说一句,您还没有遇到简单、可定制和完整的完整解决方案的原因是它并不简单。表单,它们的验证和呈现是复杂的,特别是如果你想为任何目的定制它。 ZF 的表单组件是一个很好的例子,说明了如何正确解耦和分离所有关注点以获得最终的可扩展表单构建器(包括通过 Zend_Dojo 或 ZendX_Jquery 的客户端代码)。但它们也是为此所需复杂性的一个很好的例子。即使使用方便的数组配置,也很难让它们随心所欲,尤其是当您需要脱离默认配置和渲染时。

    【讨论】:

    • 您非常圆滑地说,我想说的是:Zend 框架是过度工程的典范,我不知道效仿它们是否是一个值得的目标。 en.wikipedia.org/wiki/Overengineering
    • 感谢您的回复。我同意它“感觉”(好吧,“看起来”)像更少的编码,但您不需要太多的 API 知识,因为“配置”选项是显式字符串。例如。在 conlonefish 示例中 'type'=>'inputText'。正如我在使用 IDE 时所提到的,这使它变得更加乏味。我完全同意 HTML4 表单非常复杂(由于变化的数量和处理元素的方式不一致,例如,如果未选择多复选框,则不会通过 POST 发送变量),并且正如每个人都提到的那样,zend 过于复杂。但就是这样吗?只是为了“UX”?
    • @Josh “UX”不是很重要的一点吗?即使它对开发人员来说“只是”?您必须知道配置字符串是有道理的,但是 IMO 知道这些需要对类及其方法的了解比对它们进行 OO 了解要少。 - 附注:我不认为 Zend_Form 过于复杂或过度设计它允许。我很确定有人会想出一个更易于使用且更适合 特定 类型的表单构建器,但 Zend_Form 专门针对 any 表单。跨度>
    • 所以这真的是一个见仁见智的问题,不通过数组实现没有性能优势或重大缺陷。我想我会坚持 OO 初始化,将来可能会添加一个数组“config”样式的函数。
    猜你喜欢
    • 2011-04-25
    • 2012-07-20
    • 2023-03-15
    • 2016-08-31
    • 2011-12-14
    • 2017-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多