2017-09-05 6 views
0

私のエンティティにファイル属性を追加するには、Symfony2.8アプリケーションでVichUploaderBundleを使用しています。以下のエンティティのコードをご覧ください。VichUploaderBundleでファイルをnullにできないようにする

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; 
    } 
} 

1つの例外を除いてすべて正常に動作します。私はfilenameがヌル可能でないようにしたい。ファイルは作成エンティティにアップロードする必要があり、更新中に削除することはできません。変更のみ可能です。一部のファイルは常にエンティティにアップロードする必要があります。これを達成する方法は?

* @Assert\NotNull() 

次に、検証フォームでファイル名が空であるため、動作しません。永続エンティティの間に生成されます。しかし、このアサートを省略すると、ファイルをアップロードせずにエンティティを永続化することができます。

+0

このバンドルは一度も使用していませんが、 – sh4

答えて

1

解決策はとてもシンプルでとても近かった。私はFileエンティティにカスタムバリデータを追加するだけです。私はこれをどのようにしましたか?

まず、ファイルエンティティに注釈を追加しました。以下のコードをご覧ください。

/** 
* @ORM\Table(name="website_file") 
* @ORM\Entity(repositoryClass="WebsiteBundle\Repository\FileRepository") 
* @Vich\Uploadable 
* @Assert\Callback({"WebsiteBundle\Validator\Entities\FileValidator", "validate"}) 
*/ 
class File 

プロパティの注釈はそのままです。

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

そして最後のステップ - 本当にシンプルな検証ツール。

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(); 
     } 
    } 
} 

このファイルをエンティティ用にアップロードする必要があり、更新中にファイルを削除することはできません。

関連する問題