2013-02-16 3 views
13

Zend framework 2 ValidatorChain을 통해 빈 값을 사용자 정의 유효성 검사기로 전달하려면 어떻게해야합니까? Zend framework 2 validator에 빈 값 전달

그것은 빈 요소 값 ZF2에서 allowEmpty(false)

의해 ZF1 가능이었다

  • allowEmpty = false 경우 NotEmptyValidator는 breakOnFailure = true, @see Zend/InputFilter/Input#injectNotEmptyValidator으로 ValidatorChain의 상부에 첨가된다. (내가 제대로 그것을 가지고있는 경우)

    문제에 있다는 것입니다 :

  • allowEmpty = true 경우, 요소는 ZF2 버전 2.1.1에 대해 유효한 것으로 @see Zend/InputFilter/BaseInputFilter#isValid

    if ($input->allowEmpty()) { 
        $this->validInputs[$name] = $input; 
        continue; 
    } 
    
+1

http://akrabat.com/zend-framework-2/setting-up-required-fields-that-can-be-empty-with-zendinputfilter/ – Sam

+0

allow_empty = true 및 my 요소 값이 비어있는 경우, zf2는 해당 요소가 유효하고 유효성 검사기를 호출하지 않는 것으로 간주합니다. – deyine

+0

나는 당신의 문제를 이해하지 못한다고 생각합니다. 빈 값을 허용하거나 사용하지 마십시오. 빈 값을 허용하지 않으면 모든 유효성 검사기가 실행되고 그렇지 않으면 빈 입력이 제공되면 유효성 검사가 실패합니다. 허용하면 공백 값을 더 이상 검증 할 필요가 없습니다. o – Sam

답변

14

다음 작품으로 간주됩니다 다음 예제에서는 빈 값 'fieldName'에 대해 유효성 검사가 트리거되지 않습니다.

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->setAllowEmpty(true) 
    ->setRequired(false) 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, no output 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // true, no output 

에 이것은 당신의 CMS의 페이지에 할당 된 URL을 확인하고 충돌을 피하는 같은 당신은 특별한 경우가있을 때 매우 성가신하지만 이것은 매우 성가신 일 수있다 (빈 URL 여전히 URL입니다!) .

기본적으로 NotEmpty 유효성 검사기를 직접 연결하고 setRequiredsetAllowEmpty으로 전화하지 않으려면이 문자열을 처리하는 방법이 있습니다. 이것은 기본적으로 utomatically 자체에 NotEmpty 검증을 첨부하지 Zend\InputFilter\Input#injectNotEmptyValidator을 말할 것이다 :

$input = new \Zend\InputFilter\Input('fieldName'); 

$input 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) { 
     echo 'called validator!'; 

     return true; // valid 
    })); 

$inputFilter = new \Zend\InputFilter\InputFilter(); 
$inputFilter->add($input); 

$inputFilter->setData(array('fieldName' => 'value')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array('fieldName' => '')); 
var_dump($inputFilter->isValid()); // true, echoes 'called validator!' 

$inputFilter->setData(array()); 
var_dump($inputFilter->isValid()); // false (null was passed to the validator) 

당신은 또한 null에 대해 확인하고 싶다면, 당신은 다음과 같은 Zend\InputFilter\Input을 확장해야합니다 : 당신이 만약

class MyInput extends \Zend\InputFilter\Input 
{ 
    // disabling auto-injection of the `NotEmpty` validator 
    protected function injectNotEmptyValidator() {} 
} 
+0

당신은 그것을했습니다, 나는 null과 공백을 체크하고 싶습니다. 그래서 마지막 솔루션이 제 구현을 확인합니다. 고마워. – deyine

+5

_Zend \ InputFilter \ Input_를 확장하는 대신'$ input-> setContinueIfEmpty (true);'를 수행하면 작업이 줄어들고 더 간단 해지면서 동일한 효과를 얻을 수 있습니다. –

2

유효성 검사를 위해 별도의 양식 유효성 검사 클래스 또는 배열 표기법을 사용하는 것과 같이 다음과 같이 할 수 있습니다.

$factory  = new Zend\InputFilter\Factory(); 
$inputFilter = new Zend\InputFilter\InputFilter(); 

$inputFilter->add($factory->createInput(array(
    'name' => 'name', 
    'required' => false, 
    'allowEmpty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim'), 
    ), 
    'validators' => array(
     array(
      'name' => 'StringLength', 
      'options' => array(
       'encoding' => 'UTF-8', 
       'min' => '8', 
       'max' => '100', 
      ), 
     ), 
    ), 
))); 

required => falseallowEmpty => true이있는 배열을 입력 필터 팩토리에 전달할 수 있습니다 (입력 필터에도 직접 전달할 수 있음을 기억하므로 - 확실하지 않음).

25

continue_if_empty 내 문제가 해결되었습니다. @ dson-horácio-Junior에 감사드립니다.

'required'   => false, 
'allow_empty'  => false, 
'continue_if_empty' => true, 
'validators'  => array(
    array(
     'name' => 'Callback', 
     'options' => array(
      'callback' => function ($value, $context = []) use ($self) { 
       // ... 
      } 
     ) 
    ) 
) 

allow_empty 처음에 빈 문자열을 무효화하고 continue_if_empty이 그 다음이 될 수 있습니다 : 값이 빈 문자열 때

$this->add(array(
    'name' => 'field', 
    'continue_if_empty' => true, 
    'filters' => array(
     array('name' => 'StripTags'), 
     array('name' => 'StringTrim') 
    ), 
    'validators' => array(
     array(
      'name' => 'Application\Form\Validator\Sample' 
     ) 
    ) 
)); 

public function isValid($value, $context = null) 
{ 
    if ($value == '' && $context['otherfield'] == '') { 
     $this->error(self::INVALID_FIELD); 

     return false; 
    } 

    // ... 
} 
+0

완벽한 답변. 감사합니다 – Abadis

+0

우수 답변! 더 많은 upvotes가 필요합니다. 'continue_if_empty'를'true'로 설정하면'InputFilter \ Factory'는'NotEmpty' 검사기를 자동으로 추가하지 않으므로 모든 유효성 검사는 사용자 정의 유효성 검사기로갑니다. – kachar

+0

멋진 답변 감사합니다 +1 –

7

이 내 Callback 검증의 검증을 트리거 : 이것은 내가 사용하는 것입니다 다음에 나오는 유효성 검사기에 의해 평가됩니다.

+0

이것은 해결책입니다, 감사합니다 벤 –

+0

내 하루 저장! 감사 –

2

종종 사람들은 실수로 allowEmpty을 inputFilter config 배열에 사용하는 것을 봅니다.문자열에는 낙타의 경우가 아니라 밑줄이 쳐져야합니다. 키 '의 fieldName'로 필드를 의미

'fieldName' => array(
    'name'  => 'fieldName', 
    'required' => true, 
    'allow_empty' => true, 
    'filters' => array(
     //... your filters ... 
    ) 
    'validators' => array(
     //... your validators ... 
    ), 
); 

데이터에 존재해야하지만, 그 값은 비어있을 수있다 : 그래서 allow_empty 작동합니다.