2015-10-27 42 views
0

我使用Zend Framework 2來構建我的項目。在我的一種形式中,只有滿足給定的條件(例如,另一個表單字段的值),我纔有一個字段需要與多個驗證器驗證。在Zend Framework中跳過驗證器2表格

有沒有辦法完全跳過基於外部條件的字段驗證?

回答

1

您可以使用InputFilter類中的方法setValidationGroup來設置應驗證哪些輸入字段。

你可以例如擴展InputFilter類,並在定製setData方法使用setValidationGroup,並設置爲根據特定字段的$data存在的組。

例如是這樣的:

<?php 

namespace Application\InputFilter; 

use Zend\InputFilter\InputFilter; 

class CustomInputFilter extends InputFilter 
{ 
    /** 
    * Set data to use when validating and filtering 
    * 
    * @param array|Traversable $data 
    * @return InputFilterInterface 
    */ 
    public function setData($data) 
    { 
     $group = array(
      // your custom validation group 
     ); 
     if(isset($data['fieldName'])){ 
      $this->setValidationGroup($group); 
     } 

     // Forward to default setData method 
     return parent::setData($data); 
    } 
} 

擴展類只是一個展示什麼是可能的選項。您當然也可以在外部其他地方使用setValidationGroup,而無需自定義InputFilter類。

$group = array(
    // your custom validation group 
); 
$inputFilter->setValidationGroup($group); 
+0

謝謝您的回答。這是一個很好的起點。其實我使用的是你提出的相同的方法,但直接在表單上而不是在輸入過濾器本身,但實質是一樣的。你知道是否有辦法檢索當前的輸入過濾器驗證組,因爲接口中沒有getter? – marcosh

+0

@marcosh顯然這不是課堂上可用的。您可以添加一個getter,但是當您執行getValues時,只會返回經過驗證的字段。所以你知道什麼是通過檢查返回值中的鍵來驗證的。 – Wilt

0

您還可以使用$context參數從Zend\Validator\ValidatorInterface搶其他表單元素的值。您需要的只是一個自定義驗證器,並將其設置在表單元素上。

例如:

use Zend\Validator; 
use Zend\Validator\Exception; 

class MyCustomValidator implements Validator\ValidatorInterface 
{ 
    public function isValid($value, array $context = []) 
    { 
     if (! isset($context['name_of_other_field'])) { 
      throw new Exception\RuntimeException('name_of_other_field missing.'); 
     } 

     if (1234 === $context['name_of_other_field']) { 

      $validator = new Validator\ValidatorChain(); 

      $validator->attach(new Validator\StringLength(['min' => 8, 'max' => 12])); 
      $validator->attach(new Validator\EmailAddress()); 

      return $validator->isValid($value); 
     } 

     return true; 
    } 

    public function getMessages() 
    {} 
}