多个文件上传Symfony2抛出异常

时间:2015-03-18 16:38:43

标签: php symfony file-upload upload

您好我正在尝试使用Annonce和一些图像之间的oneToMany关系进行文件上传;因此,Annonce可以包含0个或更多图像,并且图像仍然附加到Annonce。我认为我的实体一切正常,但是当我提交表单时我收到了这个错误。

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

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

AnnonceType.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';
    }

}
  

AnnonceSellType.php(AnnonceType.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()”,“addImage()”/“removeImage()”,   “setImages()”,“images()”,“__ set()”或“__call()”存在并具有   “MDB \ AnnonceBundle \ Entity \ Annonce”中的公共访问。

我不明白因为我的实体中存在这些getter。有人有想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

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