我使用Zend Framework 2來構建我的項目。在我的一種形式中,只有滿足給定的條件(例如,另一個表單字段的值),我纔有一個字段需要與多個驗證器驗證。在Zend Framework中跳過驗證器2表格
有沒有辦法完全跳過基於外部條件的字段驗證?
我使用Zend Framework 2來構建我的項目。在我的一種形式中,只有滿足給定的條件(例如,另一個表單字段的值),我纔有一個字段需要與多個驗證器驗證。在Zend Framework中跳過驗證器2表格
有沒有辦法完全跳過基於外部條件的字段驗證?
您可以使用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);
您還可以使用$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()
{}
}
謝謝您的回答。這是一個很好的起點。其實我使用的是你提出的相同的方法,但直接在表單上而不是在輸入過濾器本身,但實質是一樣的。你知道是否有辦法檢索當前的輸入過濾器驗證組,因爲接口中沒有getter? – marcosh
@marcosh顯然這不是課堂上可用的。您可以添加一個getter,但是當您執行getValues時,只會返回經過驗證的字段。所以你知道什麼是通過檢查返回值中的鍵來驗證的。 – Wilt