2

好的,所以我来自 Flex/ActionScript 的背景,因为这个领域正在慢慢消亡,我认为是时候转向全职 PHP 了。
无论如何,我认为我对 Zend 框架有很好的理解(我工作的大多数地方都使用过它)。但是,他们主要将它用于表抽象类,所以这确实不是一个好的 MVC 实践,更像是 Model。
进行面试时,我几乎总是被问到表单验证在哪里进行。
现在我知道 zend 已经内置了表单验证器,我不是在谈论这个。
我说的是在视图中构建并提交给服务器的标准 HTML 表单。

我想知道的问题是,在控件中还是在模型中做得更好。

还有为什么要使用zend_form,对我来说,设计师似乎很难让它变得性感。

4

2 回答 2

1

如果您将验证器附加到表单元素,则表单在控制器中进行验证,并且可以使用简单的 if() 循环进行检查:

if($form->isValid($postData)) {
    //do some stuff
}

否则,您可以使用Zend_Filter_Input在控制器中验证简单的 html 表单或其他输入:

//set filters and validators for Zend_Filter_Input
    $filters = array(
        'id' => array('HtmlEntities', 'StripTags')
    );

    $validators = array(
        'id' => array('NotEmpty', 'Int')
    );

    //assign Input
    $input = new Zend_Filter_Input($filters, $validators);
    $input->setData($this->getRequest()->getParams());
if ($input->isValid()) {
//do some stuff
}

无论哪种方式,您都希望至少在控制器中进行基本验证和过滤,以尝试防止跨站点脚本和 sql 注入。
如果需要,您始终可以在域模型中进行更深入的验证和过滤。

至于为什么要使用 Zend_Form,它并没有最初出现的那么糟糕。使用自定义消息附加验证器和过滤器的能力对某些人非常有用。装饰器虽然一开始很困难,但可以通过实践很好地使用。你也作弊,只使用viewScript() 装饰器(就像我通常做的那样)。viewScript 装饰器以更熟悉的形式提供了很多控制。

这是一个例子:

//The Form
class Application_Form_Search extends Zend_Form
{
    public function init() {
        $this->setMethod('POST');
        $this->setDecorators(array(
            array('ViewScript', array(
                    'viewScript' => '_searchForm.phtml'//the partial script used as a decorator
            ))
        ));
        // create new element
        $query = $this->createElement('text', 'query');
        // element options
        $query->setLabel('Search Keywords');
        $query->setAttribs(array('placeholder' => 'Artist or Title',
            'size' => 27,
        ));
        // add the element to the form
        $this->addElement($query);

        $submit = $this->createElement('submit', 'search');
        $submit->setLabel('Search Site');
        $submit->setDecorators(array('ViewHelper'));
        $this->addElement($submit);
    }
}

部分脚本:

<article class="search">
    <form action="<?php echo $this->element->getAction() ?>"
          method="<?php echo $this->element->getMethod() ?>">
        <table>
            <tr>
                <th><?php echo $this->element->query->renderLabel() ?></th>
            </tr>
            <tr>
                <td><?php echo $this->element->query->renderViewHelper() ?></td>
            </tr>
            <tr>
                <td><?php echo $this->element->search ?></td>
            </tr>
        </table> 
    </form>
</article>

正如您所看到的,这对于代码来说会更加熟悉,并且对于设计师来说更容易设计样式。

希望这有帮助,祝你好运...

于 2012-06-29T08:02:40.553 回答
0

验证是模型的一部分,因为它知道验证某些实体但在控制器内部使用的业务逻辑。

Zend_Form 带有像 ViewScript 这样的装饰器,它使设计者能够让它变得性感,并使开发人员的验证、过滤、填充表单输入的工作变得轻而易举。

于 2012-06-29T08:03:38.927 回答