Zend framework 为什么使用zend窗体装饰器而不是单独渲染?

Zend framework 为什么使用zend窗体装饰器而不是单独渲染?,zend-framework,zend-form,Zend Framework,Zend Form,我试图用装饰器来设计我的Zend表单,这几乎到了极限。以前为了避免这些问题,我会创建一个扩展zend_表单的表单脚本,添加我需要的任何验证器、标签等,然后使用$form->getElement('my_form_element')从我的视图脚本中检索元素 这样我就可以在元素周围包装任何我想要的css标记。我想我应该学习如何使用内置的装饰器,但我开始觉得这是在浪费我的时间。我的老方法似乎更简单,是否有什么原因使我看不到使用自定义装饰器更好?如果您的表单有特定的可重复标记,例如如果您想使用引导,装

我试图用装饰器来设计我的Zend表单,这几乎到了极限。以前为了避免这些问题,我会创建一个扩展zend_表单的表单脚本,添加我需要的任何验证器、标签等,然后使用
$form->getElement('my_form_element')从我的视图脚本中检索元素


这样我就可以在元素周围包装任何我想要的css标记。我想我应该学习如何使用内置的装饰器,但我开始觉得这是在浪费我的时间。我的老方法似乎更简单,是否有什么原因使我看不到使用自定义装饰器更好?

如果您的表单有特定的可重复标记,例如如果您想使用引导,装饰器可以派上用场。除此之外,特别是如果你有一个优秀的html/css人员,我会避免使用他们。

一般来说,装饰器用于动态添加功能,而不必触及代码的核心功能,并且可以更好地重用代码。然而,在
Zend_Form
中,我认为decorator系统(以及
Zend_Form
一般来说)是不直观的,而且设计过度,因此它的作用与它应该做的恰恰相反:帮助开发人员更快地创建更好、更直观的代码

在我看来,
Zend_Form_Decorator
的使用只有在您有一些扩展逻辑的情况下才有意义,您计划在整个项目中对多种不同类型的元素重用这些逻辑

让我举两个例子:

  • 您希望在任意表单元素旁边添加一个工具提示图标,该元素具有一个漂亮的图标和一个奇特的JavaScript悬停框
  • 在输入数据时,应通过发布AJAX请求并在元素旁边添加成功时的绿色复选标记或失败时的红十字图标来直接验证元素
  • 使用decorator,您现在可以将添加的功能的逻辑与底层元素的逻辑分离,因此您可以使用相同的代码将工具提示和/或实时验证功能添加到textbox元素以及任何其他元素,只需将所有要添加的decorator添加到元素中即可


    Zend Framwork的首席开发人员Matthew Weier O'Phinney也写了一篇很好的文章,介绍了使用Decorator的动机,并提供了很多例子:

    不要花太多时间在decorators上,ZF2中有一个全新的Zend_表单系统,他们已经离开了装饰师,转向了观景助手。希望它会更简单。值得注意的是,如果您使用的是
    ,那么您就隐式地使用了附加到元素本身的装饰器(如ViewHelper、标签、描述、错误等)。当然,如果您深入挖掘以获得元素本身更细粒度的组件,比如
    $elt->getLabel()
    ,那么您确实在避免使用装饰器。尽管如此,我发现除非我创建自定义视图帮助程序来呈现表单元素,否则我的自定义表单呈现视图脚本中有很多重复的样板文件标记,否则使用decorator会很枯燥。我团队中经验丰富的开发人员仍然不完全理解这些decorator。这更多的是一个尝试和错误的过程,希望它看起来像你希望它在某一点上看!(我们在ZF1.12中仍然有很多遗留代码)。