2012-11-17 3 views
6

Zend Framework 2를 사용하여 응용 프로그램을 만들고 있습니다. InputFilter을 사용하여 입력을 검증하고 있습니다. 조건부로 Input 일부를 만들 수 있습니까? 나는 그런 식으로 코드를 의미 : Zend Framework의 2 InputFilter에서 조건부로 필요합니다.

$filter = new \Zend\InputFilter\InputFilter(); 
$factory = new \Zend\InputFilter\Factory(); 
$filter->add($factory->createInput(array(
    'name' => 'type', 
    'required' => true 
))); 
$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => true 
))); 

내가 필드 something, type1 동일한 경우에만 요구되는 원한다. 그것을 할 수있는 기본 방법이 있습니까? 아니면 사용자 정의 유효성 검사기를 만들어야합니까?

답변

8

첫째, 당신은 현재의 빈/null 값에 대한 검증을 가능하게 할 수 있습니다 Empty values passed to Zend framework 2 validators

당신은 다음 예에서와 같이 콜백 입력 필터를 사용할 수 있습니다

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value) use ($type) { 
     return $value || (1 != $type->getValue()); 
    })); 

$filter->add($type); 
$filter->add($smth); 

이 기본적으로 작동 값 smth이 빈 문자열 A가있을 때 nd type의 값은 1이 아닙니다. type의 값이 1이면 smth은 빈 문자열과 달라야합니다.

+0

PHP가 인터페이스를 매우 느슨하게 검사하기 때문에'isValid ($ value, array $ context = [])'메서드로 유효성 검사기를 정의 할 수 있습니다. 그런 식으로,'$ context'는 상황에 맞는 유효성 검사를 가능/불가능하게하는 데 사용할 수 있습니다. – Ocramius

-3

불행하게도 당신이 그렇게처럼 조건에 따라 필요한 옵션을 설정해야 할 것 : 모든

$filter->add($factory->createInput(array(
    'name' => 'smth', 
    'required' => (isset($_POST['type']) && $_POST['type'] == '1'), 
))); 
+4

이것은 잘못된 것입니다. 필터링 된 요청을 기반으로 필터 관련 값을 설정합니다. 이는 개념적으로 잘못되었습니다. – Ocramius

1

$ type-> getValue가 항상 NULL이므로 Ocramius가 작동하도록 예제를 얻지 못했습니다. $ context를 사용하기 위해 코드를 약간 변경했는데 이것은 내게 속임수였습니다 :

$filter = new \Zend\InputFilter\InputFilter(); 
$type = new \Zend\InputFilter\Input('type'); 
$smth = new \Zend\InputFilter\Input('smth'); 

$smth 
    ->getValidatorChain() 
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL)) 
    ->attach(new \Zend\Validator\Callback(function ($value, $context){ 
     return $value || (1 != $context['type']); 
    })); 

$filter->add($type); 
$filter->add($smth); 
관련 문제