检查唯一约束违规

时间:2016-11-10 20:29:11

标签: zend-framework2 zend-inputfilter

我的实体上有两个字段形成一个唯一约束:fieldAfieldB,分别映射到数据库列field_afield_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函数并将我的自定义逻辑放在那里。

1 个答案:

答案 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)
    {
          ....
    }


}