我有一个自定义验证约束来检查表单中输入的书名是否是唯一的。 我无法使用@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.
}
嘿约翰,谢谢你的回答。我创建了类约束和测试,我只想传递当前名称属性,所以没有“整本书”。我得到的问题是,在“bookNameProperty”中,我只看到字符串“name”,但不是实际的名称值。我用我当前的代码更新我的问题,也许你可以看看它:) –
值“name”是模型的属性路径。请阅读我上面发布的名为property accessor的链接。您将此路径和模型传递给访问器,它将为您返回值。 –
好的,抱歉:)我会看看,谢谢!我试了一个小时才弄清楚“UniqueEntity”约束是如何工作的,所以我认为属性访问器应该是解决方案。 –