SYMFONY FORM中的自定义约束,来自`class ****验证器的`validate()`扩展了ConstraintValidator`,而不是通过buildForm()实现触发

时间:2016-05-31 08:56:49

标签: forms symfony-forms symfony

我在SYMFONY设计的自定义约束中遇到问题,我让它工作然后它停止工作,我试图弄清楚我做错了什么。

此处的代码是我几天前发布的一个问题,其中包含有关我的自定义约束的完整代码:My custom constraint code

我将复制引导这个新问题的代码部分。

我放了一些dump()来查看扩展约束类的__construct()函数中的工作原理:

/**
 * @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';
}
}

并且,与之链接的ConstraintValidator扩展类:

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();
        }
    }
}

在表单设计中:

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"))
            )
          ));

    ...
    }
}

当我提交表单时,它没有正确显示,因为它没有触发约束。我可以通过SYMFONY _profiler看到,类{CheckValueAlreadyInDB中的dump($options)中的__construct()可以正常工作,但是我没有看到类CheckValueAlreadyInDB中的dump('validatedBy() starts'),也看不到dump('validate starts')来自类CheckValueAlreadyInDBValidator。

有谁知道我做错了什么或者对我应该调查的地方有任何暗示?

有关代码的其他信息:

MyEntity课程:

class MyEntity{


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

    } 

我的服务:

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 }

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。

我的错误是尝试在constraints中使用class MyEntityType extends AbstractType

   $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"))
        )
      ));

不要在这里使用

请查看文档中的class-constraint-validator部分。

在实体的类上方实现ConstraintValidator扩展类,验证者必须执行其检查,而不是在Entity类的一个属性之上。这样,您就可以访问实体的其他属性,并将其用作ConstraintValidator扩展类中的条件。