多文件上载Symfony2引发异常


Multiple file upload Symfony2 throwing exception

你好,我正在尝试使用Annance和一些图像之间的oneToMany关系上传文件;因此,一个注释可以包含0个或多个图像,并且一个图像仍然附加到一个注释。我认为我的实体一切都可以,但我在提交表格时遇到了这个错误。

> Annonce.php
<?php
namespace MDB'AnnonceBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use Doctrine'Common'Collections'ArrayCollection;

/**
 * Annonce
 *
 * @ORM'Table()
 * @ORM'Entity(repositoryClass="MDB'AnnonceBundle'Entity'AnnonceRepository")
 */
class Annonce {
    public function __construct() {
        $this->date = new 'Datetime();
        $this->categories = new ArrayCollection();
        $this->images= new ArrayCollection();
    }
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @var string
     *
     * @ORM'Column(name="titre", type="string", length=255)
     */
    private $titre;
    /**
     * @var string
     *
     * @ORM'Column(name="description", type="string", length=255)
     */
    private $description;
    /**
     * @ORM'Column(name="date", type="date")
     */
    private $date;
    /**
     * @var float
     *
     * @ORM'Column(name="prix", type="float")
     */
    private $prix;
    /**
     * @ORM'ManyToOne(targetEntity="MDB'AdresseBundle'Entity'Ville", inversedBy="annonces")
     */
    private $ville;
    /**
     * @ORM'ManyToMany(targetEntity="MDB'AnnonceBundle'Entity'Category", cascade={"persist"})
     */
    private $categories;
    /**
     * @ORM'ManyToMany(targetEntity="MDB'UserBundle'Entity'User")
     *
     */
    private $wishlist;
    /**
     * @var boolean
     *
     * @ORM'Column(name="telAppear", type="boolean")
     */
    private $telAppear;
    /**
   * @ORM'ManyToOne(targetEntity="MDB'UserBundle'Entity'User", inversedBy="annonces")
   * @ORM'JoinColumn(nullable=false)
   */
  private $user;
    /**
     * @ORM'OneToMany(targetEntity="MDB'PlatformBundle'Entity'Image", mappedBy="annonce")
     */
    private $images;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }
    /**
     * Set titre
     *
     * @param string $titre
     * @return Annonce
     */
    public function setTitre($titre) {
        $this->titre = $titre;
        return $this;
    }
    /**
     * Get titre
     *
     * @return string 
     */
    public function getTitre() {
        return $this->titre;
    }
    /**
     * Set description
     *
     * @param string $description
     * @return Annonce
     */
    public function setDescription($description) {
        $this->description = $description;
        return $this;
    }
    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription() {
        return $this->description;
    }
    /**
     * Set prix
     *
     * @param float $prix
     * @return Annonce
     */
    public function setPrix($prix) {
        $this->prix = $prix;
        return $this;
    }
    /**
     * Get prix
     *
     * @return float 
     */
    public function getPrix() {
        return $this->prix;
    }

    public function addCategory(Category $category) {
        // Ici, on utilise l'ArrayCollection vraiment comme un tableau
        $this->categories[] = $category;
        return $this;
    }
    public function removeCategory(Category $category) {
        $this->categories->removeElement($category);
    }
    public function getCategories() {
        return $this->categories;
    }
    public function getDate() {
        return $this->date;
    }
    public function setDate($date) {
        $this->date = $date;
    }
    public function getWishlist() {
        return $this->wishlist;
    }
    public function setWishlist($wishlist) {
        $this->wishlist = $wishlist;
    }
    public function getVille() {
        return $this->ville;
    }
    public function setVille($ville) {
        $this->ville = $ville;
    }
    public function getTelAppear() {
        return $this->telAppear;
    }
    public function setTelAppear($telAppear) {
        $this->telAppear = $telAppear;
    }
    public function getUser() {
        return $this->user;
    }
    public function setUser($user) {
        $this->user = $user;
    }

 public function addImage(Image $image) {
        $this->images[] = $image;
        $image->setUser($this);
        return $this;
    }
    public function removeImage(Image $image) {
        $this->images->removeElement($image);
    }
    public function getImages() {
        return $this->images;
    }
}

图片.php

<?php
namespace MDB'PlatformBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
use Symfony'Component'Validator'Constraints as Assert;
/**
 * Image
 *
 * @ORM'Table()
 * @ORM'Entity
 */
class Image {
    /**
     * @var integer
     *
     * @ORM'Column(name="id", type="integer")
     * @ORM'Id
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM'Column(type="string", length=255, nullable=true)
     */
    private $path;
    /**
     * @var string
     *
     * @ORM'Column(name="alt", type="string", length=255)
     */
    private $alt;
    /**
     * @ORM'ManyToOne(targetEntity="MDB'AnnonceBundle'Entity'Annonce", inversedBy="images")
     * @ORM'JoinColumn(nullable=true)
     */
    private $annonce;
     /**
     * @Assert'File(maxSize="6000000")
     */
    public $file;
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId() {
        return $this->id;
    }
    /**
     * Set url
     *
     * @param string $url
     * @return Image
     */
    public function setUrl($url) {
        $this->url = $url;
        return $this;
    }
    /**
     * Get url
     *
     * @return string 
     */
    public function getUrl() {
        return $this->url;
    }
    /**
     * Set alt
     *
     * @param string $alt
     * @return Image
     */
    public function setAlt($alt) {
        $this->alt = $alt;
        return $this;
    }
    /**
     * Get alt
     *
     * @return string 
     */
    public function getAlt() {
        return $this->alt;
    }
    public function getAnnonce() {
        return $this->annonce;
    }
    public function setAnnonce($annonce) {
        $this->annonce = $annonce;
    }
    public function getAbsolutePath() {
        return null === $this->path ? null : $this->getUploadRootDir() . '/' . $this->path;
    }
    public function getWebPath() {
        return null === $this->path ? null : $this->getUploadDir() . '/' . $this->path;
    }
    protected function getUploadRootDir() {
        // le chemin absolu du répertoire où les documents uploadés doivent être sauvegardés
        return __DIR__ . '/../../../../web/' . $this->getUploadDir();
    }
    protected function getUploadDir() {
        // on se débarrasse de « __DIR__ » afin de ne pas avoir de problème lorsqu'on affiche
        // le document/image dans la vue.
        return 'uploads/documents';
    }
    public function getFile() {
        return $this->file;
    }
    public function setFile($file) {
        $this->file = $file;
    }
}

AnnunceType.php

<?php
namespace MDB'AnnonceBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
class AnnonceType extends AbstractType {
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('titre')
                ->add('description')
                ->add('date')
                ->add('prix')
                ->add('telAppear', 'checkbox', array('required' => false))
                ->add('ville', new 'MDB'AdresseBundle'Form'VilleType(), array('required' => true))
                ->add('categories')
                ->add('wishlist')
        ;
    }
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MDB'AnnonceBundle'Entity'Annonce'
        ));
    }
    /**
     * @return string
     */
    public function getName() {
        return 'mdb_annoncebundle_annonce';
    }
}

AnnanceSellType.php(AnnanceType.php的继承人)

<?php
namespace MDB'AnnonceBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use 'MDB'PlatformBundle'Form'ImageType;
class AnnonceSellType extends AbstractType {
    private $arrayListCat;
    public function __construct($arrayListCat) {
        $this->arrayListCat = $arrayListCat;
    }
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->remove('wishlist')
                ->remove('date')
                ->remove('categories')
                ->add('titre')
                ->add('description', 'textarea')
                ->add('prix')
                ->add('categories', 'choice', array(
                    'choices' => $this->arrayListCat,
                    'multiple' => true,
                    'mapped' => false,
                ))
                ->add('images', new ImageType())
        ;
    }
    /**
     * @return string
     */
    public function getName() {
        return 'mdb_annoncebundle_annonce_sell';
    }
    public function getParent() {
        return new AnnonceType();
    }
}

ImageType.php

<?php
namespace MDB'PlatformBundle'Form;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
class ImageType extends AbstractType {
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder
                ->add('file')
        ;
    }
    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setDefaults(array(
            'data_class' => 'MDB'PlatformBundle'Entity'Image'
        ));
    }
    /**
     * @return string
     */
    public function getName() {
        return 'mdb_platformbundle_image';
    }
}

我在提交表格时有以下错误:

属性"images"和其中一个方法"addImag()"/"removeImag(,"setImages()"、"images()","__set()"或"__call()"存在并且具有类"MDB''AnnanceBundle''Entity''Annance"中的公共访问。

我不明白为什么这些getter存在于我的实体中。有人有主意吗?

感谢

这个错误是逻辑错误。只需使用集合字段类型即可解决问题