ZF2 - 使用Fieldsets时的验证器上下文

时间:2014-10-16 10:45:07

标签: validation zend-framework2 fieldset

有没有办法在fieldset-element的验证器中访问整个表单的上下文?似乎标准行为是上下文仅包含元素所在的字段集的表单数据。

这是我的自定义验证器:

/**
 * Returns if the given value is valid
 *
 * @param  string  $value
 * @param  array   $context
 * @return boolean
 */
public function isValid($value, array $context = array())
{
    $this->setValue($value);

    $bookingId = isset($context['auftrag_buchung_id'])
        ? (int) $context['auftrag_buchung_id']
        : null;

    try {
        $anlieferung = new \DateTime($value);
    } catch (\Exception $e) {
        $this->error(self::NOT_DATETIME);
        return false;
    }

    try {
        $booking = $this->table->getById($this->user, $bookingId);
    } catch (\Exception $e) {
        $this->error(self::NOT_FOUND);
        return false;
    }

    if (!$this->isInBookingRange($value, $booking)) {
        $this->error(self::NOT_IN_BOOKINGRANGE);
        return false;
    }

    return true;
}

我的问题是$ context只包含我配置此验证器的字段集的表单数据。但是我必须检查不在fieldset中的值

1 个答案:

答案 0 :(得分:1)

在使用InputFilter将验证器分配给表单时,应该可以将表单实例注入验证器。

// 
$form = new \Zend\Form\Form();

/* ..following could be within __construct() Method of the Form object */

// 
$element = new \Zend\Form\Element\Text('text');
$form->add($element);

// 
$inputFilter = new \Zend\InputFilter\InputFilter();

// 
$textInput = new \Zend\InputFilter\Input('text');

// Add validator with injected form instance
$textInput->getValidatorChain()
          ->attach(new CustomValidator($form));

$inputFilter->add($textInput)

//  
$form->setInputFilter($inputFilter);

使用此设置,您应该能够在验证类中使用表单数据:

class CustomValidator {

    private $form;

    public function __construct($form) {
        $this->form = $form;
    }

    public function isValid($value) {

        // Access form data
        $this->form->getData();
    }
}