2017-09-05 6 views
0

J'utilise VichUploaderBundle dans mon application Symfony2.8 pour ajouter un attribut de fichier à mon entité. S'il vous plaît voir le code de l'entité ci-dessous.Rendre le fichier non nullable dans VichUploaderBundle

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

Et tout fonctionne bien avec une exception. Je veux rendre le nom de fichier non nullable. Le fichier doit être téléchargé lors de la création de l'entité et ne peut pas être supprimé pendant la mise à jour. Cela peut seulement être changé. Certains fichiers doivent toujours être téléchargés dans l'entité. Comment y parvenir? Si j'ajoute affirmer pour le nom de fichier comme:

* @Assert\NotNull() 

Ensuite, cela ne fonctionne pas, car lors de la validation du formulaire, le nom de fichier est vide. Il est généré au cours de l'entité persistante. Mais si j'omets cette affirmation, alors il est possible de persister entité sans télécharger le fichier.

+0

Je n'ai jamais utilisé ce paquet, – sh4

Répondre

1

La solution était si simple et si proche. J'ai juste besoin d'ajouter un validateur personnalisé à mon entité File. Comment j'ai fait ça?

J'ai d'abord ajouté une annotation à l'entité Fichier. Veuillez consulter le code ci-dessous

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

Les annotations pour les propriétés restent les mêmes.

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

Et la dernière étape - Validateur qui est vraiment simple.

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

Ajoutez de ce fait le fichier à télécharger pour l'entité et il ne peut pas être supprimé pendant la mise à jour.