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

标签 validation symfony constraints unique-constraint

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

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

所以我为图书实体的 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 Validator 类中验证当前的图书名称。

如何在这一行中将当前的书名传递给我的验证器类:

@CustomAssert\UniqueBookName(groups={"Editmode"})

我知道如何在这里传递参数:

 @CustomAssert\UniqueBookName(exampleProperty="name", groups={"Editmode"})

但是我怎样才能通过,例如exampleProperty 当前书名的真实值,而不是字符串“name”?

问候


更新答案:

我的类(class)约束:

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

}

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

 public function validate($value, Constraint $constraint)
  {
   // here, in $constraint I only see the String Value "name", not the current value I want.
  }

最佳答案

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

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

$book = new Book(); 
$book->oldBook = $repository->fetchBook($id); 
$form ...

作为使该模型尽可能可重用的良好实践,我另外将属性名称指定为约束的参数。使用property accessor ,然后您可以检索值。几乎与 UniqueEntity 类验证器指定“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;

 }

关于validation - Symfony 自定义验证约束传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30593937/

相关文章:

javascript - 当前和 future 的 MMO JavaScript 游戏如何阻止玩家欺骗系统?

c# - 当输入为 0.00 时,正则表达式验证在 ModelState.IsValid 处失败

php - 是否可以共享 Symfony2 安装(一台服务器上的多个网站 [域])

php - 如何注册新的 payum 支付方式和添加操作?

mysql - 如何在单个字段中存储多个选择值 Symfony2

constraints - 使约束求解器更难解决约束?

validation - 如何保留 f :viewParam values after postback with validation failed

javascript - Jquery文件验证器: How to call a function on success?

mysql - SQL - (外键?)对表名的约束?

出现键盘时IOS App Layout Constraint Errors