2016-11-10 150 views
0

我在我的實體上有兩個字段,它們形成一個唯一約束: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, 
    ]); 
} 

我想弄清楚,以驗證那些2場是在數據庫表中是唯一的最佳方式。如果已經存在具有相同字段值的不同實體,則輸入過濾器將無法通過驗證。

我在想我會覆蓋isValid函數,並把我的自定義邏輯放在那裏。

+3

我會建議在這兩個字段上使用回調驗證器(Zend \ Validator \ Callback),並將您的自定義邏輯放在回調函數中。 –

+1

@ElenaSlavcheva可以發佈爲答案。 – Wilt

回答

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


}