2015-12-28 3 views
1

Я создаю одно приложение, используя симфонию 3 и FOSUserBundle.
Я создал свой класс User с другими пристрастиями, и один из них - изображение профиля.
Вот мой класс User:Symfony2 FOSUserBundle не загружает изображение профиля

#src/UserBundle/Entity/User.php 
<?php 
namespace UserBundle\Entity; 

use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 

/** 
* @ORM\Entity 
* @ORM\Table(name="users") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class User extends BaseUser { 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @ORM\Column(name="first_name", type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    private $first_name; 

    /** 
    * @var string 
    * @ORM\Column(name="last_name", type="string", length=255) 
    * @Assert\NotBlank() 
    */ 
    private $last_name; 

    /** 
    * @var string 
    * @ORM\Column(name="address", type="string", length=255, nullable=true) 
    */ 
    private $address; 

    /** 
    * @var string 
    * @ORM\Column(name="post", type="string", length=255, nullable=true) 
    */ 
    private $post; 

    /** 
    * @var string 
    * @ORM\Column(name="city", type="string", length=255, nullable=true) 
    */ 
    private $city; 

    /** 
    * @var \DateTime 
    * @ORM\Column(name="birth_date", type="datetime", nullable=true) 
    */ 
    private $birth_date; 

    /** 
    * @var string 
    * @ORM\Column(name="gender", type="string", length=1) 
    */ 
    private $gender; 

    /** 
    * @ORM\Column(type="string", length=255, nullable=true) 
    */ 
    private $path; 

    /** 
    * @Assert\File(
    *  maxSize = "5M", 
    *  mimeTypes = {"image/jpeg", "image/gif", "image/png", "image/tiff"}, 
    *  maxSizeMessage = "The maximum allowed file size is 5MB.", 
    *  mimeTypesMessage = "Only the file types image are allowed.") 
    */ 
    public $file; 

    public function __construct() { 
     parent::__construct(); 
    } 

    /** 
    * @return string 
    */ 
    public function getAddress() { 
     return $this->address; 
    } 

    /** 
    * @return string 
    */ 
    public function getFirstName() { 
     return $this->first_name; 
    } 

    /** 
    * @param string $first_name 
    */ 
    public function setFirstName($first_name) { 
     $this->first_name = $first_name; 
    } 

    /** 
    * @return string 
    */ 
    public function getLastName() { 
     return $this->last_name; 
    } 

    /** 
    * @param string $last_name 
    */ 
    public function setLastName($last_name) { 
     $this->last_name = $last_name; 
    } 

    /** 
    * @param string $address 
    */ 
    public function setAddress($address) { 
     $this->address = $address; 
    } 

    /** 
    * @return string 
    */ 
    public function getPost() { 
     return $this->post; 
    } 

    /** 
    * @param string $post 
    */ 
    public function setPost($post) { 
     $this->post = $post; 
    } 

    /** 
    * @return string 
    */ 
    public function getCity() { 
     return $this->city; 
    } 

    /** 
    * @param string $city 
    */ 
    public function setCity($city) { 
     $this->city = $city; 
    } 

    /** 
    * @return \DateTime 
    */ 
    public function getBirthDate() { 
     return $this->birth_date; 
    } 

    /** 
    * @param \DateTime $birth_date 
    */ 
    public function setBirthDate($birth_date) { 
     $this->birth_date = $birth_date; 
    } 

    /** 
    * @return string 
    */ 
    public function getGender() { 
     return $this->gender; 
    } 

    /** 
    * @param string $gender 
    */ 
    public function setGender($gender) { 
     $this->gender = $gender; 
    } 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpload() { 
     if (null !== $this->file) { 
      $this->path = uniqid('', true) . '.' . $this->file->guessExtension(); 
     } 
    } 

    /** 
    * @ORM\PostPersist() 
    * @ORM\PostUpdate() 
    */ 
    public function upload() { 
     if (null === $this->file) { 
      return; 
     } 
     $this->file->move($this->getUploadRootDir(), $this->path); 
     unset($this->file); 
    } 

    /** 
    * @ORM\PostRemove() 
    */ 
    public function removeUpload() { 
     if ($this->file == $this->getAbsolutePath()) { 
      unlink($this->file); 
     } 
    } 

    public function getAbsolutePath() { 
     return null === $this->path ? null : $this->getUploadRootDir() . '/' . $this->path; 
    } 

    public function getWebPath(){ 
     return null === $this->path ? null : $this->getUploadDir() . '/' . $this->id . '/' . $this->path; 
    } 

    protected function getUploadRootDir() { 
     return __DIR__ . '/../../../web/' . $this->getUploadDir() . '/' . $this->id; 
    } 

    protected function getUploadDir() { 
     return 'uploads/users'; 
    } 

    /** 
    * @param string $path 
    * @return User 
    */ 
    public function setPath($path) { 
     $this->path = $path; 
     return $this; 
    } 

    /** 
    * @return string 
    */ 
    public function getPath() { 
     return $this->path; 
    } 

    public function setEmail($email) { 
     $email = is_null($email) ? '' : $email; 
     parent::setEmail($email); 
     $this->setUsername($email); 

     return $this; 
    } 
} 

Тогда у меня есть класс ProfileFormType:

#src/UserBundle/Form/Type/ProfileFormType.php 
<?php 

namespace UserBundle\Form\Type; 

use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\DateType; 
use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\FileType; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 

class ProfileFormType extends AbstractType { 
    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->remove('username'); 
     $builder->remove('current_password'); 
     $builder->add('first_name', TextType::class, array('label' => "First Name", 'invalid_message' => 'Please enter your First Name')); 
     $builder->add('last_name', TextType::class, array('label' => "Last Name", 'invalid_message' => 'Please enter your Last Name')); 
     $builder->add('address', TextType::class); 
     $builder->add('post', TextType::class, array('label' => "Post Code")); 
     $builder->add('city', TextType::class); 
     $builder->add('gender', ChoiceType::class, array('choices' => array('Male' => 'm', 'Female' => 'f'), 'choices_as_values' => true)); 
     $builder->add('birth_date', DateType::class, array('label' => "Birth Date", 'widget' => 'single_text', 'invalid_message' => 'Please enter a valid date')); 
     $builder->add('file', FileType::class, array('label' => "Profile Picture", 'data_class' => null)); 
    } 

    public function getParent() { 
     return 'FOS\UserBundle\Form\Type\ProfileFormType'; 
    } 
} 

Моя форма выглядит что-то вроде:

#src/UserBundle/Resources/views/Profile/edit_content.html.twig 
     {{ form_start(form, { 'action': path('fos_user_profile_edit'), 'attr': { 'class': 'fos_user_profile_edit' } }) }} 
     <div class="col-md-12"> 
      <span class="btn btn-default btn-file"> Browse {{ form_widget(form.file) }}</span> 
     </div> 
     <div class="col-md-12"> 
      <input type="submit" id="_submit" name="_submit" value="{{ 'profile.edit.submit'|trans }}" class="btn btn-success" /> 
     </div> 
     {{ form_end(form) }} 

форма представлена ​​правильно, и показать ошибки, если они есть.
Но в базе данных «путь» пуст, и папка (с разрешениями на чтение/запись) пуста.
Когда я добавляю {{ form_enctype(form) }} к форме, я получил ошибку: Unknown "form_enctype" function in FOSUserBundle:Profile:edit_content.html.twig
Мои вопросы: Как я могу это исправить?
Я не вижу никакой ошибки, и все выглядит отлично, но это не работает.

ответ

1

Вам необходимо включить жизненного цикла обратного вызова для вашей организации: http://symfony.com/doc/current/book/doctrine.html#lifecycle-callbacks

+0

Я добавил @ORM \ HasLifecycleCallbacks() в верхней части класса, но это все та же. Любое другое предложение? – BrunoRamalho

+1

Вы пытались очистить кеш метаданных Doctrine? Можете ли вы также показать свой контроллер? – xabbuh

+0

Да, я очистил кэш метаданных доктрины. У меня нет контроллера на этом комплекте. Нужно ли переопределять контроллер? Потому что все остальные поля обновляются (например, имя/фамилия, адрес и т. Д.). Но файл не следует загружать один раз, когда у меня есть PrePersist, PreUpdate, PostPersist и PostUpdate? – BrunoRamalho

Смежные вопросы