2016-07-14 6 views
2

hinzufügen Ich versuche, ein Profilbild in meinem Benutzer Entity hinzuzufügen, aber ich scheitere, ich arbeite mit symfony 3 und fosuserbundle, für diese Arbeit benutze ich einen Listner, hier meinen gesamten Code: der Code meiner UserEntity:wie Profilbild in UserEntity mit FosUserBundle

namespace Forum\ForumBundle\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; 
use Symfony\Component\Security\Core\Util\SecureRandom; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Component\HttpFoundation\File\File; 

/** 
* @ORM\Entity 
* @ORM\Table(name="fos_user") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class User extends BaseUser 

{ 

    /** 
    * @ORM\Column(type="string") 
    * 
    * @Assert\NotBlank(message="Please, upload the product brochure as a PDF file.") 
    * @Assert\Image(
    *  
    *) 
    */ 
    private $brochure; 

    public function getBrochure() 
    { 
     return $this->brochure; 
    } 

    public function setBrochure(File $file = null) 
    { 
     $this->brochure = $file; 

     return $this; 
    } 

public function __construct() 
    { 
     parent::__construct(); 
     $this->test = false; 
     // $this->uploadProfilePicture(); 
     // your own logic 
    } 

} 

Meine Zuhörer:

namespace Forum\ForumBundle\EventListener; 

use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Doctrine\ORM\Event\LifecycleEventArgs; 
use Doctrine\ORM\Event\PreUpdateEventArgs; 
use Forum\ForumBundle\Entity\User; 
use Forum\ForumBundle\FileUploader; 

class BrochureUploadListener 
{ 
    private $uploader; 

    public function __construct(FileUploader $uploader) 
    { 
     $this->uploader = $uploader; 
    } 

    public function prePersist(LifecycleEventArgs $args) 
    {die("good"); 
     $entity = $args->getEntity(); 

     $this->uploadFile($entity); 
    } 

    public function preUpdate(PreUpdateEventArgs $args) 
    { 
     $entity = $args->getEntity(); 

     $this->uploadFile($entity); 
    } 

    private function uploadFile($entity) 
    { 
     // upload only works for Product entities 
     if (!$entity instanceof Product) { 
      return; 
     } 

     $file = $entity->getBrochure(); 

     // only upload new files 
     if (!$file instanceof UploadedFile) { 
      return; 
     } 

     $fileName = $this->uploader->upload($file); 
     $entity->setBrochure($fileName); 
    } 
} 

die Verwendung Uploader Datei Hörer:

namespace Forum\ForumBundle; 

use Symfony\Component\HttpFoundation\File\UploadedFile; 

class FileUploader 
{ 
    private $targetDir; 

    public function __construct($targetDir) 
    { 
     $this->targetDir = $targetDir; 
    } 

    public function upload(UploadedFile $file) 
    { 
     $fileName = md5(uniqid()).'.'.$file->guessExtension(); 

     $file->move($this->targetDir, $fileName); 

     return $fileName; 
    } 
} 

ich konfigurieren meine Dienste als auch

app.brochure_uploader: 
     class: Forum\ForumBundle\FileUploader 
     arguments: ['%brochures_directory%'] 
    app.doctrine_brochure_listener: 
     class: Forum\ForumBundle\EventListener\BrochureUploadListener 
     arguments: ['@app.brochure_uploader'] 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 
      - { name: doctrine.event_listener, event: preUpdate } 

ein I den Parameter deklarieren: Broschüre-Verzeichnis in config.yml

parameters: 
    locale: fr 
    brochures_directory: 'web/uploads/brochures' 

die Probleme ist, wenn ich meine Einheit aktualisieren, die bro

<?php 
 

 
/* 
 
* This file is part of the FOSUserBundle package. 
 
* 
 
* (c) FriendsOfSymfony <http://friendsofsymfony.github.com/> 
 
* 
 
* For the full copyright and license information, please view the LICENSE 
 
* file that was distributed with this source code. 
 
*/ 
 

 
namespace FOS\UserBundle\Controller; 
 

 
use FOS\UserBundle\FOSUserEvents; 
 
use FOS\UserBundle\Event\FormEvent; 
 
use FOS\UserBundle\Event\FilterUserResponseEvent; 
 
use FOS\UserBundle\Event\GetResponseUserEvent; 
 
use FOS\UserBundle\Model\UserInterface; 
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
 
use Symfony\Component\HttpFoundation\Request; 
 
use Symfony\Component\HttpFoundation\RedirectResponse; 
 
use Symfony\Component\Security\Core\Exception\AccessDeniedException; 
 

 
/** 
 
* Controller managing the user profile 
 
* 
 
* @author Christophe Coevoet <[email protected]> 
 
*/ 
 
class ProfileController extends Controller 
 
{ 
 
    /** 
 
    * Show the user 
 
    */ 
 
    public function showAction() 
 
    { 
 
     $user = $this->getUser(); 
 
     if (!is_object($user) || !$user instanceof UserInterface) { 
 
      throw new AccessDeniedException('This user does not have access to this section.'); 
 
     } 
 

 
     return $this->render('FOSUserBundle:Profile:show.html.twig', array(
 
      'user' => $user 
 
     )); 
 
    } 
 

 
    /** 
 
    * Edit the user 
 
    */ 
 
    public function editAction(Request $request) 
 
    { 
 
     $user = $this->getUser(); 
 
     if (!is_object($user) || !$user instanceof UserInterface) { 
 
      throw new AccessDeniedException('This user does not have access to this section.'); 
 
     } 
 

 
     /** @var $dispatcher \Symfony\Component\EventDispatcher\EventDispatcherInterface */ 
 
     $dispatcher = $this->get('event_dispatcher'); 
 

 
     $event = new GetResponseUserEvent($user, $request); 
 
     $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_INITIALIZE, $event); 
 

 
     if (null !== $event->getResponse()) { 
 
      return $event->getResponse(); 
 
     } 
 

 
     /** @var $formFactory \FOS\UserBundle\Form\Factory\FactoryInterface */ 
 
     $formFactory = $this->get('fos_user.profile.form.factory'); 
 

 
     $form = $formFactory->createForm(); 
 
     $form->setData($user); 
 

 
     $form->handleRequest($request); 
 

 
     if ($form->isValid()) { 
 
      /** @var $userManager \FOS\UserBundle\Model\UserManagerInterface */ 
 
      $userManager = $this->get('fos_user.user_manager'); 
 

 
      $event = new FormEvent($form, $request); 
 
      $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_SUCCESS, $event); 
 

 
      $userManager->updateUser($user); 
 

 
      if (null === $response = $event->getResponse()) { 
 
       $url = $this->generateUrl('fos_user_profile_show'); 
 
       $response = new RedirectResponse($url); 
 
      } 
 

 
      $dispatcher->dispatch(FOSUserEvents::PROFILE_EDIT_COMPLETED, new FilterUserResponseEvent($user, $request, $response)); 
 

 
      return $response; 
 
     } 
 

 
     return $this->render('FOSUserBundle:Profile:edit.html.twig', array(
 
      'form' => $form->createView() 
 
     )); 
 
    } 
 
}

+0

Ich bin alle aus Vorschlägen. Möglicherweise müssen Sie eine weitere Frage stellen und überlegen, ob Sie etwas übersehen haben. Tut mir leid, ich habe versucht zu helfen. –

+0

Vielen Dank :) –

Antwort

0

Haben Sie versucht, Ihre config.yml an sich ändernde:

parameters: 
    locale: fr 
    brochures_directory: '%kernel.root_dir%/../web/uploads/brochures' 

Vielleicht ist das Problem? Probieren Sie es zuerst aus.

Bearbeiten # 2. Zweitens können Sie Ihre app/config/parameters.yml bearbeiten und den folgenden Parameter hinzu:

brochures_directory: uploads/brochures 

Auch stellen Sie sicher, dass Sie den Cache jedes Mal räumen:

php bin/console cache:clear --env=prod 

sehen, ob das funktioniert.

Bearbeiten # 3. Ich merke, dass sich Ihre Konfiguration ziemlich von der Standardkonfiguration unterscheidet, und ich habe versucht, das Setup zu duplizieren, aber es ist eine Menge Arbeit damit verbunden.

Ich sehe einen Unterschied in dem, was ich verwende, und Sie verwenden, die auch das Problem beeinflussen könnten Sie sehen:

parameters: 
    locale: fr 
    brochures_directory: uploads/brochures 

Also mit anderen Worten, die Anführungszeichen entfernen und von ‚web‘ Präfix loszuwerden. Stellen Sie außerdem sicher, dass Sie diese Ordner erstellt haben, darunter "Uploads" und "Broschüren".

Sehen Sie, ob das funktioniert.

Wie ich schon sagte ich habe versucht zu duplizieren, bu dann bekomme ich die "Bitte laden Sie die Produktbroschüre als PDF-Datei." auf der "Registrieren" -Seite, aber es würde immer noch eine Menge Arbeit für mich geben, zu versuchen, dein Setup zu duplizieren.

Ich denke, es ist wahrscheinlich etwas Einfaches, basierend auf der Tatsache, dass ich diese Nachricht bekomme.

+0

Ich denke Sie für Ihre Antwort, Ja, ich habe versucht, aber es funktioniert nicht –

+0

Hallo, ich habe meinen Beitrag bearbeitet. Können Sie den zweiten Vorschlag bitte versuchen? –

+0

Hallo, ich denke Sie wieder für Ihre Antwort, inforutualy itss funktioniert nicht :(, das gleiche Problem immer noch –