@Assert \ NotEqualTo()不起作用

时间:2017-08-07 08:29:31

标签: php symfony

我有两个实体Candidate和ProgramType具有多对一关系

Candidate.php:

/**
 * @ORM\ManyToOne(targetEntity="ProgramType", inversedBy="candidates")
 * @ORM\JoinColumn(name="program_type", referencedColumnName="id")
 * @Assert\NotBlank(message="lead.programtype.not_blank",groups={"registration","profile"})
 * @Assert\NotEqualTo("1",groups={"registration","profile"}) 
 */
public $programtype;

ProgramType.php:

/**
 * One ProgramType has Many Candidates.
 * @ORM\OneToMany(targetEntity="Candidate", mappedBy="programtype")
 */
private $candidates;

public function __construct() {
    $this->candidates = new ArrayCollection();
 }

问题是这一行@Assert\NotEqualTo("1",groups={"registration","profile"})。断言声明不起作用。任何想法?

1 个答案:

答案 0 :(得分:0)

您的programType位于ProgramType类型的对象上,因此" 1"是一个字符串,或一个数字...或任何PHP想要它。

来自http://php.net/manual/en/language.operators.comparison.php

  

$ a!= $ b如果$ a在类型后不等于$ b,则不等于TRUE   杂耍。

然后你相信php的类型杂耍。

您应该使用Expression validator

执行此类操作
@Assert\Expression( 
    expression="this.programTypeIsNotEqualTo()",
    groups={"registration","profile"}
)

并实施

public function programTypeIsNotEqualTo() {
    return $this->programType->getId()!==1;
}

在您的实体中。

更新:表达式验证器已在Symfony 2.4中引入,因此在2.3中您可以使用实体顶部的Callback验证器

/**
 * @Assert\Callback(
 *    methods={"programTypeIsNotEqualTo"}
 *    groups={"registration","profile"}
 * )
 * @Entity()
 *
 */
  class XXXX {
  }