2016-05-31 4 views
0

Ich habe Probleme mit einer benutzerdefinierten Einschränkung, die ich in SYMFONY entworfen, ich habe es funktioniert und dann hörte es auf zu arbeiten, und ich versuche herauszufinden, was ich falsch mache.SYMFONY Benutzerdefinierte Einschränkung in FORM, `validate()` aus `Klasse **** Validator erweitert ConstraintValidator`, nicht ausgelöst durch buildForm() Implementierung

über den Code hier ist eine Frage, die ich mit meinem ganzen Code in Bezug auf meiner benutzerdefinierten Einschränkung vor wenigen Tagen veröffentlicht: My custom constraint code

Ich werde der Teil des Codes kopieren, die diese neue Frage führt.

Ich habe einige dump() zu sehen, was in meiner __construct() Funktion der Klasse erstreckt Constraint arbeitete:

/** 
* @Annotation 
*/ 
class CheckValueAlreadyInDB extends Constraint{ 
public $message; 
public $fieldToSearch; 
public $tableToSearch; 
public $idToCheck; 
public $idToCheckFieldName; 

public function __construct($options){ 
    dump($options); 
    if(count($options)>0){ 
     $this->idToCheck = $options['idToCheck']; 
     $this->idToCheckFieldName = $options['idToCheckFieldName']; 
     $this->fieldToSearch = $options['fieldToSearch']; 
     $this->tableToSearch = $options['tableToSearch']; 
     $this->message = $options['message']; 
    } 
} 

public function validatedBy() 
{ 
    dump('validatedBy() starts'); 
    return 'validator_check_value_already_in_db'; 
} 
} 

Und die ConstraintValidator erweiterte Klasse mit ihm verbunden:

class CheckValueAlreadyInDBValidator extends ConstraintValidator 
{ 
    private $con; 

    public function __construct($con){ 
     $this->con = $con; 
    } 

    public function validate($value, Constraint $constraint) 
    { 
     dump('validate starts'); 
     ////My stuff to get a record from the DB//// 
     $sel = new PdoSelect($this->con); 
     $search = $sel->returnRecordsInTableForSpecificKey([$constraint->fieldToSearch],[$value], $constraint->tableToSearch,false); 
     ////////////////////////////////////////////// 

     $sameId = false; 
     if($constraint->idToCheck!==null){ 
      $idToCheckInRetrieveRecord = $search->{$constraint->idToCheckFieldName};    
      $sameId = ($idToCheckInRetrieveRecord==$constraint->idToCheck)?true:false; 
     } 

     if($search!=null&&!$sameId){ 
      $this->context->buildViolation($constraint->message) 
       ->setParameter('%string%', $value) 
       ->addViolation(); 
     } 
    } 
} 

Und in der Formularentwurf:

class MyEntityType extends AbstractType {  
public function buildForm(FormBuilderInterface $builder, array $options) 
     { 

    .... 
     $builder->add('myValue',****Type::class,array(
      'constraints' => array(
       new CheckValueAlreadyInDB(array(
       'idToCheck'=>$options['data']->getId(), 
       'idToCheckFieldName'=>'id', 
       'fieldToSearch'=>'my_value', 
       'tableToSearch'=>'my_table', 
       'message' => "value_already_exists_in_db")) 
      ) 
     )); 

    ... 
    } 
} 

W Wenn ich das Formular abschicke, wird es nicht korrekt ausgeführt, da es die Einschränkung nicht auslöst. Ich kann durch den SYMFONY _profiler sehen, dass die dump($options) in __construct(), der Klasse CheckValueAlreadyInDB, funktioniert, aber ich sehe nicht die dump('validatedBy() starts') aus der Klasse CheckValueAlreadyInDB und weder die dump('validate starts') aus der Klasse CheckValueAlreadyInDBValidator.

Weiß jemand, was ich falsch mache oder habe ich einen Hinweis darauf, wo ich nachforschen sollte?

Weitere Informationen über den Code:

MyEntity Klasse:

class MyEntity{ 


     /** 
     * @MyBundleAssert\CheckValueAlreadyInDB(
     *  message = "already_exists_in_db", 
     *  fieldToSearch = "my_value", 
     *  tableToSearch = "my_table" 
     *) 
     */ 
     private myValue; 

    } 

Und mein Service:

validator.unique.check_value_already_in_db: 
    class: MyBundle\Form\CustomConstraints\CheckValueAlreadyInDBValidator 
    arguments: ['@doctrine.dbal.default_connection'] 
    tags: 
     - { name: validator.constraint_validator, alias: validator_check_value_already_in_db } 
+0

Können Sie die Entität posten, die Sie validieren möchten? Ich glaube Einschränkungen sind mit Entität verbunden –

+0

Ich bearbeitet die Frage mit der Entität, die ich am unteren Rand verwende. – nyluje

Antwort

0

fand ich die Lösung.

Mein Fehler war, zu versuchen constraints in class MyEntityType extends AbstractType zu verwenden:

$builder->add('myValue',****Type::class,array(
     'constraints' => array(
      new CheckValueAlreadyInDB(array(
      'idToCheck'=>$options['data']->getId(), 
      'idToCheckFieldName'=>'id', 
      'fieldToSearch'=>'my_value', 
      'tableToSearch'=>'my_table', 
      'message' => "value_already_exists_in_db")) 
     ) 
    )); 

ES NICHT NUTZEN SIE HIER

Werfen Sie einen Blick auf class-constraint-validator Abschnitt im doc.

Implementieren Sie die erweiterte Klasse ConstraintValidator über der Klasse der Entität, wo der Validator seine Prüfung ausführen muss und nicht über einem Attribut der Entity-Klasse. Auf diese Weise kann man auf andere Attribute der Entität zugreifen und sie als Bedingung in der erweiterten Klasse ConstraintValidator verwenden.