Symfony:只有一个文件实体,每个关联有不同的验证规则



在我当前的项目中,我决定只创建一个可翻译的文件实体,并将其重用于我拥有的所有图像/文档属性。对于翻译,我使用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约束应该起作用,我不明白为什么它没有。

最新更新