私のエンティティにファイル属性を追加するには、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()
次に、検証フォームでファイル名が空であるため、動作しません。永続エンティティの間に生成されます。しかし、このアサートを省略すると、ファイルをアップロードせずにエンティティを永続化することができます。
このバンドルは一度も使用していませんが、 – sh4