在我当前的项目中,我决定只创建一个可翻译的文件实体,并将其重用于我拥有的所有图像/文档属性。对于翻译,我使用Knp Doctrine Behaviors Translatable。所以这是代码。
文件类:
class File
{
use ORMBehaviorsTranslatableTranslatable;
/**
* @var integer
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
public function __toString()
{
return (string)$this->id;
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
}
可翻译的文件类:
class FileTranslation
{
use ORMBehaviorsTranslatableTranslation;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
public $name;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
public $path;
/**
* @AssertFile()
*/
private $file;
/*
* Non tracked parameter
*/
public $folder;
/**
* Set name.
*
* @param string $name
*/
public function setName($name)
{
$this->name = $name;
}
/**
* Get name.
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set path.
*
* @param string $path
*/
public function setPath($path)
{
$this->path = $path;
}
/**
* Get path.
*
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* Sets file.
*
* @param UploadedFile $file
*/
public function setFile(UploadedFile $file = null)
{
$this->file = $file;
}
/**
* Get file.
*
* @return UploadedFile
*/
public function getFile()
{
return $this->file;
}
/**
* Set folder
*
* @param string $folder
*
* @return File
*/
public function setFolder($folder)
{
$this->folder = $folder;
return $this;
}
/**
* Get folder
*
* @return File
*/
public function getFolder()
{
return $this->folder;
}
}
然后是另一个实体(用户)如何使用它来创建图像属性的示例:
class User
{
/**
* @ORMOneToOne(targetEntity="File", cascade={"persist", "remove"})
* @ORMJoinColumn(name="image_id", referencedColumnName="id", nullable=true)
* @AssertValid()
*/
private $image;
}
没什么新鲜事。我只是遵循了Symfony/Knp文档,它工作正常。但是,现在我想在每次为不同实体创建新属性(如 $image)时添加不同的验证规则。这里最好的策略是什么?
例如,每次我尝试在 $image 属性中添加与文件相关的验证规则时,它都说找不到文件。
您可以为每个实体设置特定的验证器:
/**
* vérification des constraintes
* @AssertCallback
*/
public function validate(ExecutionContextInterface $context)
{
var_dump($this->image);// do your check here
}
对于那些有同样问题的人,我终于按照@sylvain所说的做了,我创建了我的自定义验证器:
http://symfony.com/doc/current/cookbook/validation/custom_constraint.html
这是一个很棒的教程,顺便说一句:
https://knpuniversity.com/screencast/question-answer-day/custom-validation-property-path
它工作正常。但是,我仍然认为@valid约束应该起作用,我不明白为什么它没有。