Zend 1 到 Zend 2,正在使用装饰器,我现在如何实现相同的行为?

Zend 1 to Zend 2, was using decorators, how can i achieve the same behavior now?

问题的标题不是 self-explanatory,因为有很多关于将 Zend 1 应用程序迁移到 Zend 2 应用程序的问题,所以我将切入我的问题的具体细节。

首先,我们在视图文件中对表单元素使用了 decorators,如下所示:

$element = new Zend_Form_Element_Text('element');
$element->setLabel('Element');
$element->setRequired();
$element->setDecorators(array(new Nti_Form_Decorator_Item()) );
print $element;

new Nti_Form_Decorator_Item() 部分是有问题的装饰器。此 class 接收元素并添加一些自定义 html 以在视图内呈现。因此,我们不是简单的 label/input,而是使用自定义 classes 包裹整个东西的一些不错的 div。

class Nti_Form_Decorator_Item extends Zend_Form_Decorator_Abstract {
...
...
public function render($content) {
    $element = $this->getElement();
    // Build all the html here, using some methods of 
    // the Zend_Form_Decorator_Abstract class.
    return html_entity_decode($html);
}

这就是我们在 Zend 1 中的做法,很好的旧装饰器。
现在团队决定更新框架,我们的观点遇到了很多麻烦,因为 decorator 显然早已不复存在,我们没有找到一种快速简便的方法来实现相同的结果所有视图文件的自定义(我们视图中的每个表单元素都使用装饰器进行标准设计)。

我看过 ViewHelper 之类的东西,但不明白如何去做。

有人能给我一些建议吗?

如果你想在每个元素周围使用相同的标记,最简单的方法是覆盖 formRow() 助手。定义您自己的此助手版本:

namespace Nti\Form\View\Helper;

use Zend\Form\View\Helper\FormRow as ZfFormRow;
use Zend\Form\ElementInterface;

class FormRow extends ZfFormRow
{
    /**
     * @param  ElementInterface $element
     * @throws \Zend\Form\Exception\DomainException
     * @return string
     */
    public function render(ElementInterface $element)
    {
        // build your markup here
        $html = '<div>';
        $html .= parent::render($element);
        $html .= '</div>';

        return $html;
    }
}

并将其作为可调用项添加到您的 module.config.php:

'view_helpers' => array(
    'invokables' => array(
        'form-row' => 'NtiForm\Form\View\Helper\FormRow'
    )
)