• Как строишь приложения на Symfony2 ты?

    bboytiwst
    @bboytiwst Автор вопроса
    Ну раз никто ничего интересного не пишет, напишу сам :) Может решение и достаточно очевидное, но постоянно вижу дубли кода для загрузки файлов в Symfony2 когда не требуется что то комплексное как Gaufrette или же Doctrine Uploadable, можно использовать трейты.

    src/Traits/UploadTrait.php

    <?php
    
    
    namespace YouBundle\Traits;
    use Symfony\Component\HttpFoundation\File\UploadedFile;
    use Symfony\Component\Validator\Constraints as Assert;
    
    trait UploadTrait {
    
        /**
         * @Assert\File(
         * maxSize="2M",
         * mimeTypes={
         *     "image/png",
         *     "image/jpeg",
         *     "image/gif",
         *     "image/jpg"
         * }
         * )
         *
         */
        private $file;
    
        private $temp;
    
        /**
         * @return mixed
         */
        public function getFile()
        {
            return $this->file;
        }
        /**
         * Sets file.
         *
         * @param UploadedFile $file
         */
        public function setFile(UploadedFile $file = null)
        {
            $this->file = $file;
    
            if (isset($this->path)) {
                $this->temp = $this->path;
                $this->path = null;
            } else {
                $this->path = 'initial';
            }
        }
    
        /**
         * @ORM\PrePersist()
         * @ORM\PreUpdate()
         */
        public function preUpload()
        {
    
            if (null !== $this->getFile()) {
    
                $filename = sha1(uniqid(mt_rand(), true));
                $this->path = $filename.'.'.$this->getFile()->guessExtension();
            }
        }
    
        /**
         * @ORM\PostPersist()
         * @ORM\PostUpdate()
         */
        public function upload()
        {
            if (null === $this->getFile()) {
                return;
            }
    
            $this->getFile()->move($this->getUploadRootDir(), $this->path);
    
    
            if (isset($this->temp)) {
    
                unlink($this->getUploadRootDir().'/'.$this->temp);
    
                $this->temp = null;
    
            }
            $this->file = null;
        }
    
        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()
        {
            return __DIR__.'/../../../../web/'.$this->getUploadDir();
        }
    }


    а в самой сущности надо задать свойство $path
    /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $path;


    и определить папку в которую заливать это все добро будем
    protected function getUploadDir()
        {
            return 'images/courts/photos';
        }


    P.S решение предоставляю как базовое, не претендующее на что то серьезное, код взят с официальной документации и просто завернут в трейт, который можно использовать повторно. Если будет надобность на проекте в усовершенствовании, то допилю и выложу сюда еще и обновленную версию
    Ответ написан
    2 комментария