Validation Symfony自定义验证约束传递参数

Validation Symfony自定义验证约束传递参数,validation,symfony,constraints,unique-constraint,Validation,Symfony,Constraints,Unique Constraint,我有一个自定义的验证约束来检查表单中输入的图书名称是否唯一。 我不能使用@Unique,因为这也会验证书籍的当前值,并且总是会抛出验证错误,即使我不想更改书籍名称 (如果有一种方法可以忽略当前值,我很想听到它,但我仍然想知道如何将自定义对象传递给自定义验证器:) 所以我为book实体的name属性写了这个: /** * @ORM\Entity * @UniqueEntity("name", groups={"Creation"}) */ public class Book { /

我有一个自定义的验证约束来检查表单中输入的图书名称是否唯一。 我不能使用@Unique,因为这也会验证书籍的当前值,并且总是会抛出验证错误,即使我不想更改书籍名称

(如果有一种方法可以忽略当前值,我很想听到它,但我仍然想知道如何将自定义对象传递给自定义验证器:)

所以我为book实体的name属性写了这个:

 /**
 * @ORM\Entity
 * @UniqueEntity("name", groups={"Creation"})
 */
 public class Book {

  /* 
  * @var string
  * @ORM\Column(type="string", unique = true)
  * @CustomAssert\UniqueBookName(groups={"Editmode"})
  */
  protected $name;

 }
为此,我需要在UniqueBookName验证程序类中验证的当前图书名称

我现在如何将当前图书名称传递给此行中的验证程序类

@CustomAssert\UniqueBookName(groups={"Editmode"})
我知道如何通过以下方式在此处传递参数:

 @CustomAssert\UniqueBookName(exampleProperty="name", groups={"Editmode"})
但是如何将当前图书名称的实际值传递为exampleProperty,而不是字符串“name”

问候


更新答案:

我的类约束:

 /**
 *@CustomAssert\UniqueBookName(nameProperty="name", groups={"Editmode"})
 */
 class Book{
  // Property as you described
 }
我的验证器类:

class UniqueBookName extends Constraint{

 public $message = 'book.edit.name';
 public $nameProperty;

 public function getDefaultOption()
 {
     return 'nameProperty';
 }

 public function getRequiredOptions()
 {
     return array('nameProperty');
 }

 public function validatedBy()
 {
     return 'bookName_validator';
 }


 public function getTargets()
 {
     return self::CLASS_CONSTRAINT;
 }

}
以及相应的验证器“验证”-方法:


我喜欢将虚拟资源附加到表单,作为完成此类验证的一种方式

构建书本模型时,只需为其指定一个带有书本记录实例的新属性。然后,可以将验证器作为类约束(而不是基于属性)应用,以便可以访问整个模型

$book = new Book(); 
$book->oldBook = $repository->fetchBook($id); 
$form ...
为了使这个模型尽可能可重用,我另外指定属性名称作为约束的参数。使用,然后可以检索值。几乎和Uniquentity类验证程序一样,它指定“name”属性

/**
 * @ORM\Entity
 * @CustomAssert\UniqueBookName(bookProperty="oldBook", bookNameProperty="name", groups={"Editmode"})
 * @UniqueEntity("name", groups={"Creation"})
 */
 public class Book {

  /* 
  * @var string
  * @ORM\Column(type="string", unique = true)
  */
  protected $name;

 }

嘿,约翰,谢谢你的回答。我创建了类约束,为了测试,我只想传递当前的nameProperty,所以没有“整本书”。我遇到的问题是,在“bookNameProperty”中,我只看到字符串“name”,而不是实际的name值。我用我当前的代码更新了我的问题,也许你可以看看:)值“name”是模型的属性路径。请阅读我在上面发布的名为property accessor的链接。您将此路径和模型传递给访问器,它将为您返回值。啊,好的,对不起:)我会看一看,谢谢!我花了一个小时试图弄清楚“uniquentity”约束是如何工作的,所以我认为属性访问器应该是解决方案。我不明白这应该如何工作。我总是在validate()方法中包含纯字符串。在我的FormHandler中,我调用:$errors=$this->validator->validate($book,array('Default','Editmode'));在此之前,我在$book中添加了新的“oldBook”。我还通过composer安装了属性访问器,但在我的validate()方法中,我没有对$book的访问权限。我遵循了这个示例:但仍然调用“$constraint->bookProperty”-bookProperty是一个“oldBook”字符串。。
/**
 * @ORM\Entity
 * @CustomAssert\UniqueBookName(bookProperty="oldBook", bookNameProperty="name", groups={"Editmode"})
 * @UniqueEntity("name", groups={"Creation"})
 */
 public class Book {

  /* 
  * @var string
  * @ORM\Column(type="string", unique = true)
  */
  protected $name;

 }