代码之家  ›  专栏  ›  技术社区  ›  famas23

不允许上传文件的序列化

  •  1
  • famas23  · 技术社区  · 7 年前

    我正试图通过 vichuploader bundle 使用 hwioauthbundle 这实现了UserInterface,我认为错误来自该捆绑包。。。

    “Symfony\Component\HttpFoundation\File\UploadedFile”的序列化 不允许

    我已经试过了 this solution 但也有同样的例外。

    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use HWI\Bundle\OAuthBundle\OAuth\Response\UserResponseInterface;
    use HWI\Bundle\OAuthBundle\Security\Core\User\FOSUBUserProvider as BaseClass;
    use Symfony\Component\Security\Core\User\UserInterface;
    use HWI\Bundle\OAuthBundle\Security\Core\User\OAuthUser;
    
    
    /**
     * Users 
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\UsersRepository")
     *
     */
    class Users extends  OAuthUser 
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
        /**
         * @var string
         *
         * @ORM\Column(name="first_name", type="string", length=255)
         */
        private $firstName;
    
        /**
         * @var string
         *
         * @ORM\Column(name="last_name", type="string", length=255)
         */
        private $lastName;
    
        /**
         * @var string
         *
         * @ORM\Column(name="civility", type="string", length=255, nullable=true)
         */
        private $civility;
        /**
         * @var string
         *
         * @ORM\Column(name="avatar", type="string", length=255, nullable=true)
         */
        private $avatar;
        /**
         * @var string
         *
         * @ORM\Column(name="qualification", type="string", length=255, nullable=true)
         */
        private $qualification;
    
        /**
         * @var string
         *
         * @ORM\Column(name="level", type="string", length=255, nullable=true)
         */
        private $level;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="birth_date", type="date", nullable=true)
         */
        private $birthDate;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="hiring_date", type="date", nullable=true)
         */
        private $hiringDate;
    
        /**
         * @var string
         *
         * @ORM\Column(name="country", type="string", length=255, nullable=true)
         */
        private $country;
    
        /**
         * @var string
         *
         * @ORM\Column(name="city", type="string", length=255, nullable=true)
         */
        private $city;
    
        /**
         * @var string
         *
         * @ORM\Column(name="linkedin_profil", type="string", length=255, nullable=true)
         */
        private $linkedinProfil;
    
        /**
         * @var string
         *
         * @ORM\Column(name="web_site", type="string", length=255, nullable=true)
         */
        private $webSite;
    
        /**
         * @var \DateTime
         *
         * @ORM\Column(name="date_last_cnx", type="datetimetz", nullable=true)
         */
        private $dateLastCnx;
    
    
        /**
         * 
         * @ORM\OneToOne(targetEntity="AppBundle\Entity\Files",cascade={"persist"})
         * @ORM\JoinColumn(name="file_id", referencedColumnName="id")
         */
        public $cv;
    
        /** @ORM\Column(name="google_id", type="string", length=255, nullable=true) */
        private $google_id;
    

    文件.php

    <?php
    
    namespace AppBundle\Entity;
    
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\HttpFoundation\File\File;
    use Vich\UploaderBundle\Mapping\Annotation as Vich;
    
    /**
     * Files
     * @Vich\Uploadable
     * @ORM\Table(name="files")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\FilesRepository")
     */
    class Files 
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
            /**
         * NOTE: This is not a mapped field of entity metadata, just a simple property.
         * 
         * @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName", size="imageSize")
         * 
         * @var File
         */
        protected $imageFile;
    
        /**
         * @ORM\Column(type="string", length=255)
         *
         * @var string
         */
        protected $imageName;
    
        public function getId()
        {
            return $this->id;
        }
    
    
    
    
    
        /**
         * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
         * of 'UploadedFile' is injected into this setter to trigger the  update. If this
         * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
         * must be able to accept an instance of 'File' as the bundle will inject one here
         * during Doctrine hydration.
         *
         * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
         *
         * @return Product
         */
        public function setImageFile(File $image = null)
        {
            $this->imageFile = $image;
    
            if ($image) {
                // It is required that at least one field changes if you are using doctrine
                // otherwise the event listeners won't be called and the file is lost
                $this->updatedAt = new \DateTimeImmutable();
            }
    
            return $this;
        }
    
        /**
         * @return File|null
         */
        public function getImageFile()
        {
            return $this->imageFile;
        }
    
        /**
         * @param string $imageName
         *
         * @return Product
         */
        public function setImageName($imageName)
        {
            $this->imageName = $imageName;
    
            return $this;
        }
    
        /**
         * @return string|null
         */
        public function getImageName()
        {
            return $this->imageName;
        }
    
    
    }
    

    我的表单用户类型:

    use AppBundle\Form\FilesType;
    
    
    ->add('cv',FilesType::class)
    

     -> add('imageFile',
    
     VichFileType::class, [
                'required' => false,
                'allow_delete' => true, 
                'download_link' => true,
                'label' => false, 
    
            ]);
    
    3 回复  |  直到 7 年前
        1
  •  7
  •   zizoujab    7 年前

    您正在序列化 ImageFile 这个代码中的实体这就是为什么会出现错误,请尝试删除该错误并添加 updatedAt 字段,以便条令可以跟踪实体的更改:

    /**
     * Files
     * @ORM\Table(name="files")
     * @ORM\Entity(repositoryClass="AppBundle\Repository\FilesRepository")
     * @Vich\Uploadable
     */
    class Files implements \Serializable
    {
        /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        protected $id;
    
            /**
         * NOTE: This is not a mapped field of entity metadata, just a simple property.
         * 
         * @Vich\UploadableField(mapping="product_image", fileNameProperty="imageName", size="imageSize")
         * 
         * @var File
         */
        protected $imageFile;
    
        /**
         * @ORM\Column(type="string", length=255)
         *
         * @var string
         */
        protected $imageName;
    
        /**
         * @ORM\Column(type="datetime")
         *
         * @var string
         */
        protected $updatedAt;
    
        public function getId()
        {
            return $this->id;
        }
    
    
    
    
    
        /**
         * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
         * of 'UploadedFile' is injected into this setter to trigger the  update. If this
         * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
         * must be able to accept an instance of 'File' as the bundle will inject one here
         * during Doctrine hydration.
         *
         * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image
         *
         * @return Product
         */
        public function setImageFile(File $image = null)
        {
            $this->imageFile = $image;
    
            if ($image) {
                // It is required that at least one field changes if you are using doctrine
                // otherwise the event listeners won't be called and the file is lost
                $this->updatedAt = new \DateTimeImmutable();
            }
    
            return $this;
        }
    
        /**
         * @return File|null
         */
        public function getImageFile()
        {
            return $this->imageFile;
        }
    
        /**
         * @param string $imageName
         *
         * @return Product
         */
        public function setImageName($imageName)
        {
            $this->imageName = $imageName;
    
            return $this;
        }
    
        /**
         * @return string|null
         */
        public function getImageName()
        {
            return $this->imageName;
        }
    
      /** @see \Serializable::serialize() */
        public function serialize()
        {
            return serialize(array(
                $this->id,
                $this->imageName,
    
            ));
        }
    
        /** @see \Serializable::unserialize() */
        public function unserialize($serialized)
        {
            list (
                $this->id,
    
            ) = unserialize($serialized);
        }
    
        /**
         * @return string
         */
        public function getUpdatedAt()
        {
            return $this->updatedAt;
        }
    
        /**
         * @param string $updatedAt
         */
        public function setUpdatedAt($updatedAt)
        {
            $this->updatedAt = $updatedAt;
        }
    
    
    }
    
        2
  •  1
  •   Moris Finkel    4 年前

    对于Symfony5

    Class User implement UserInterface
    
    public function __serialize(): array
        {
            return [
                'id' => $this->id,
                'email' => $this->email,
                //......
            ];
        }
    
    public function __unserialize(array $serialized): User
    {
        $this->id = $serialized['id'];
        $this->email = $serialized['email'];
        // .....
        return $this;
    }
    
        3
  •  1
  •   Herz3h    3 年前

    https://symfony.com/doc/3.3/security/entity_provider.html

    基本上,您只需要序列化id、用户名和密码(三个是上面页面上的示例代码)

    推荐文章