2015-06-02 48 views
1

我有一个自定义验证约束来检查表单中输入的书名是否是唯一的。 我无法使用@Unique,因为那样也会验证本书的当前值,并且将始终引发验证错误,即使我不想更改书名。Symfony自定义验证约束传递参数

(如果忽略当前值的方式,我很想听到它,但我仍想知道如何自定义对象传递给自定义验证:))

所以我写这为本书实体的名称属性:

/** 
* @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当前书名的实际值,而不是字符串“名称”?

问候


更新答案:

我的类约束:

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

} 

和相应的验证“有效吃法“-Method:

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

回答

2

我喜欢附加一个虚拟资源的形式作为一种方式来完成这些类型的验证。

当您构建您的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; 

} 
+0

嘿约翰,谢谢你的回答。我创建了类约束和测试,我只想传递当前名称属性,所以没有“整本书”。我得到的问题是,在“bookNameProperty”中,我只看到字符串“name”,但不是实际的名称值。我用我当前的代码更新我的问题,也许你可以看看它:) –

+0

值“name”是模型的属性路径。请阅读我上面发布的名为property accessor的链接。您将此路径和模型传递给访问器,它将为您返回值。 –

+0

好的,抱歉:)我会看看,谢谢!我试了一个小时才弄清楚“UniqueEntity”约束是如何工作的,所以我认为属性访问器应该是解决方案。 –