php – Zend Framework:设置装饰器和标签 – 应该在视图还是表单类中完成?

我注意到许多(大多数?)人在使用Zend Framework时会在Form类本身中添加装饰器和标签.

class User_Form_Add extends Zend_Form
{
    public function init()
    {
        parent::init();
        $username = new Zend_Form_Element_Text('username');
        $username->setLabel('Username:')
                 ->setRequired(true)
                 ->addFilter('StringTrim')
                 ->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30))
                 ->setDecorators(array(
                     'ViewHelper',
                     array('Description', array('tag' => 'p', 'class' => 'description')),
                     array('Label',       array('requiredPrefix'      => '<span class="asterisk">*</span>&nbsp;', 'escape' => false)),
                     array('HtmlTag',     array('tag' => 'p', 'class' => 'element'))
                 ));
    }
}

但这肯定不是好习惯吗?我原以为装饰器和标签是MVC应用程序中视图层的一部分.当我查看这个表单类时,它看起来很“混乱”了应该在视图层中的各种标记,标记和文本.

这种方法意味着如果您需要使用表单的标记,则需要使用表单类和视图.

我不喜欢这个概念,因此在渲染表单时将表单和装饰器分离为实际的视图脚本.我希望将我的申请中这些相互矛盾的“问题”分开.

class User_Form_Add extends Zend_Form
{
    public function init()
    {
        parent::init();
        $username = new Zend_Form_Element_Text('username');
        $username->setRequired(true)
                 ->addFilter('StringTrim')
                 ->addValidator('StringLength', $breakChainOnFailure = false, $options = array(1, 30));
    }
}

//add.phtml:

$this->form->username->setLabel('Username:');
$this->form->username->setDecorators(array(
    'ViewHelper',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('Label',       array('requiredPrefix'      => '<span class="asterisk">*</span>&nbsp;', 'escape' => false)),
    array('HtmlTag',     array('tag' => 'p', 'class' => 'element'))
));

echo $this->form->render();

这使表单类变得干净,并且非常类似于模型类 – 这就是我对表单类的理解;它包含过滤器,验证器等,它们都与业务逻辑相关.

如果您接着使用这种方法,则可以更轻松地将表单与模型集成,以便您可以直接从模型中重用/访问表单验证器和过滤器 – 而无需创建装饰器的开销,也不会产生任何不正常之处.

http://weierophinney.net/matthew/archives/200-Using-Zend_Form-in-Your-Models.html

至于保持您的视图脚本DRY,这样您就不会在多个视图中重复相同的标签和装饰器(即,当您需要多次渲染相同的表单,但在不同的视图脚本中)时,我发现您可以将其分开表单的可用部分使用ViewScript装饰器来保持DRY.

编辑:同样,我们也可以使用适合我们项目的默认装饰器覆盖默认装饰器,以避免必须首先声明装饰器.

所以我的实际问题是:

为什么没有其他人像这样使用他们的表格?你对这种方法有什么缺点?

如果我可以在视图层中轻松添加装饰器和表单标签,为什么要在表单类中创建装饰器和表单标签?

我不明白为什么我看到的Zend_Form的几乎所有用法都包括在表单类本身中添加装饰器/标签.

最佳答案

Why isn’t anyone else working with their forms like this?

我没想过.非常好的方法.

点赞