我的实体上有两个字段形成一个唯一约束:fieldA
和fieldB
,分别映射到数据库列field_a
和field_b
。
我的输入过滤器需要两个字段:
public function init()
{
parent::init();
$this->add([
'name' => 'field_a',
'required' => true,
'allow_empty' => false,
]);
$this->add([
'name' => 'field_b',
'required' => true,
'allow_empty' => false,
]);
}
我试图找出验证这两个字段在数据库表中是唯一的最佳方法。如果已存在具有相同字段值的不同实体,则输入过滤器将无法验证。
我以为我会覆盖isValid
函数并将我的自定义逻辑放在那里。
答案 0 :(得分:1)
我建议在两个字段上使用回调验证器(Zend \ Validator \ Callback)并将自定义逻辑放在回调函数中。
我会使用InputFilter向表单字段添加过滤器和验证器,但您可以直接在Form / Fieldset类中实现InputFilterProviderInterface。
use Zend\InputFilter\InputFilter;
class FormFilter extends InputFilter
{
public function __construct()
{
$this->add(
array(
'name' => 'field_a',
'filters' => array(),
'validators' => array (
array(
'name' => 'Zend\Validator\Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'Custom Message',
),
'callback' => array($this,'validateFieldA'),
),
),
)
)
);
$this->add(
array(
'name' => 'field_b',
'filters' => array(),
'validators' => array (
array(
'name' => 'Zend\Validator\Callback',
'options' => array(
'messages' => array(
\Zend\Validator\Callback::INVALID_VALUE => 'Custom Message',
),
'callback' => array($this,'validateFieldB'),
),
),
)
)
);
}
public function validateFieldA($value, $context)
{
// $value contains the field_a value
// $context['field_b'] contains the field_b value
// put your custom logic here
// return true if the fields are unique
// return false if the fields are not unique
}
public function validateFieldB($value, $context)
{
....
}
}