首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使文件在VichUploaderBundle中不可空

使文件在VichUploaderBundle中不可空
EN

Stack Overflow用户
提问于 2017-09-05 06:21:16
回答 1查看 899关注 0票数 1

我在Symfony2.8应用程序中使用VichUploaderBundle向实体添加文件属性。请参阅下面的实体代码。

代码语言:javascript
复制
namespace WebsiteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\HttpFoundation\File\File as UploadedFile;
use Symfony\Component\Validator\Constraints as Assert;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Table(name="website_file")
 * @ORM\Entity(repositoryClass="WebsiteBundle\Repository\FileRepository")
 * @Vich\Uploadable
 */
class File
{
    /**
     * @var int
     *
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     * @Assert\Type(type="integer")
     * @Assert\GreaterThan(value="0")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank()
     * @Assert\Type(type="string")
     * @Assert\Length(max="255")
     */
    private $title;

    /**
     * @var string
     *
     * @ORM\Column(type="text")
     * @Assert\NotBlank()
     * @Assert\Type(type="string")
     */
    private $description;

    /**
     * @var UploadedFile
     *
     * @Vich\UploadableField(mapping="file", fileNameProperty="filename")
     */
    private $file;

    /**
     * @var string
     *
     * @ORM\Column(type="string", length=255)
     * @Assert\Type(type="string")
     * @Assert\Length(max="255")
     */
    private $filename;

    /**
     * @var int
     *
     * @ORM\Column(type="integer")
     * @Assert\NotNull()
     * @Assert\Type(type="integer")
     * @Assert\GreaterThanOrEqual(value="0")
     */
    private $dummy = 0;

    /**
     * @var boolean
     *
     * @ORM\Column(type="boolean")
     * @Assert\NotNull()
     * @Assert\Type(type="boolean")
     */
    private $published;

    /**
     * @var User
     *
     * @Gedmo\Blameable(on="create")
     * @ORM\ManyToOne(targetEntity="WebsiteBundle\Entity\User")
     * @ORM\JoinColumn(onDelete="CASCADE")
     * @Assert\Type(type="WebsiteBundle\Entity\User")
     * @Assert\Valid()
     */
    private $createdBy;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(type="datetime")
     * @Assert\DateTime()
     */
    private $createdAt;

    /**
     * @var User
     *
     * @Gedmo\Blameable(on="update")
     * @ORM\ManyToOne(targetEntity="WebsiteBundle\Entity\User")
     * @ORM\JoinColumn(onDelete="CASCADE")
     * @Assert\Type(type="WebsiteBundle\Entity\User")
     * @Assert\Valid()
     */
    private $updatedBy;

    /**
     * @var \DateTime
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(type="datetime")
     * @Assert\DateTime()
     */
    private $updatedAt;

    /**
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * @param string $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * @return string
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * @param string $description
     */
    public function setDescription($description)
    {
        $this->description = $description;
    }

    /**
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @param UploadedFile $file
     */
    public function setFile($file)
    {
        $this->file = $file;
        $this->dummy++;
    }

    /**
     * @return string
     */
    public function getFilename()
    {
        return $this->filename;
    }

    /**
     * @param string $filename
     */
    public function setFilename($filename)
    {
        $this->filename = $filename;
    }

    /**
     * @return boolean
     */
    public function getPublished()
    {
        return $this->published;
    }

    /**
     * @param boolean $published
     */
    public function setPublished($published)
    {
        $this->published = $published;
    }

    /**
     * @return User
     */
    public function getCreatedBy()
    {
        return $this->createdBy;
    }

    /**
     * @param User $createdBy
     */
    public function setCreatedBy($createdBy)
    {
        $this->createdBy = $createdBy;
    }

    /**
     * @return \DateTime
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * @param \DateTime $createdAt
     */
    public function setCreatedAt($createdAt)
    {
        $this->createdAt = $createdAt;
    }

    /**
     * @return User
     */
    public function getUpdatedBy()
    {
        return $this->updatedBy;
    }

    /**
     * @param User $updatedBy
     */
    public function setUpdatedBy($updatedBy)
    {
        $this->updatedBy = $updatedBy;
    }

    /**
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * @param \DateTime $updatedAt
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;
    }
}

除了一个例外,一切都很好。我想让文件名不为空。文件必须上载到创建实体上,并且在更新期间不能删除。它只能改变。有些文件总是要上传到实体。如何做到这一点?如果我为文件名添加,如:

代码语言:javascript
复制
* @Assert\NotNull()

那么它就不能工作,因为在验证表单时,文件名是空的。它是在持久化实体期间生成的。但是如果我省略了这个断言,那么就可以在不上传文件的情况下持久化实体。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-06 10:18:30

解决方案是如此简单而又如此接近。我只需要添加自定义验证器到我的文件实体。我是怎么做到的?

首先,在文件实体中添加注释。请参阅下面的代码

代码语言:javascript
复制
/**
 * @ORM\Table(name="website_file")
 * @ORM\Entity(repositoryClass="WebsiteBundle\Repository\FileRepository")
 * @Vich\Uploadable
 * @Assert\Callback({"WebsiteBundle\Validator\Entities\FileValidator", "validate"})
 */
class File

属性的注释保持不变。

代码语言:javascript
复制
/**
 * @var UploadedFile
 *
 * @Vich\UploadableField(mapping="file", fileNameProperty="filename")
 * @Assert\Type(type="Symfony\Component\HttpFoundation\File\UploadedFile")
 */
private $file;

/**
 * @var string
 *
 * @ORM\Column(type="string", length=255)
 * @Assert\Type(type="string")
 * @Assert\Length(max="255")
 */
private $filename;

最后一步-- Validator,这很简单。

代码语言:javascript
复制
class FileValidator
{
    /**
     * @param File $file
     * @param ExecutionContextInterface $context
     */
    public static function validate(File $file, ExecutionContextInterface $context)
    {
        if ($file->getFilename() === null && $file->getFile() === null) {
            $context->buildViolation('File cannot be empty.')
                ->atPath('file')
                ->addViolation();
        }
    }
}

由于这个原因,文件必须上传为实体,并且在更新过程中不能删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46048202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档