2017-10-24 4 views
2

私はSymfony 3を初めて使用しており、アカウントを有効にしようとすると問題が発生します。 私はUser EntityをFOSUserBundleから拡張します。 FOS_Userの確認システムを有効化しました。 さらに、ユーザーが自分のアプリに登録するときには、ファイルをアップロードする必要があります。これを行うために、私はFileUploaderサービスとImageUploadListenerリスナを作成しました。 問題は、私は私のGmailのメールからの私のアクティベーションリンクをクリックしたときですが、私は次のエラーを取得する:FOSUserBundleで確認プロセス中にsymfonyが私のeventListenerを呼び出すように見えるのはなぜですか?

Uncaught PHP Exception Symfony\Component\Debug\Exception\ContextErrorException: "Notice: Undefined variable: fileName" at /home/clement/Rendu/tech-web/src/UserBundle/EventListener/ImageUploadListener.php line 49 

あなたは私を助けてもらえますか? 大きな頭痛のフランス語デベロッパーから事前にありがとうございます!

PS:ファイルアップロード機能を実装するためにthis tutorialに従った。

User.php

namespace UserBundle\Entity; 

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

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

    /** 
    * @ORM\Column(type="string", length=255) 
    * 
    * @Assert\NotBlank(message="Please enter your phone.", groups={"Registration", "Profile"}) 
    * @Assert\Length(
    *  min=3, 
    *  max=255, 
    *  minMessage="The phone is too short.", 
    *  maxMessage="The phone is too long.", 
    *  groups={"Registration", "Profile"} 
    *) 
    */ 
    protected $phone; 

    /** 
    * @ORM\Column(type="string") 
    * 
    * @Assert\NotBlank(message="Please, upload a file.") 
    * @Assert\File(mimeTypes={ "application/pdf", "image/jpeg" }) 
    */ 
    private $image; 

    public function __construct() 
    { 
     parent::__construct(); 
     // your own logic 
     $this->roles = array('ROLE_USER'); 
    } 

    public function getPhone() { 
     return $this->phone; 
    } 

    public function setPhone($phone) { 
     $this->phone = $phone; 
    } 


    public function setImage($image) 
    { 
     $this->image = $image; 
     return $this; 
    } 

    public function getImage() 
    { 
     return $this->image; 
    } 
} 

RegistrationType.php

namespace UserBundle\Form; 

use UserBundle\Entity\User; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Form\Extension\Core\Type\FileType; 

class RegistrationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('phone') 
      ->add('image', FileType::class); 
    } 

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

     // Or for Symfony < 2.8 
     // return 'fos_user_registration'; 
    } 

    public function getBlockPrefix() 
    { 
     return 'app_user_registration'; 
    } 

    // For Symfony 2.x 
    public function getName() 
    { 
     return $this->getBlockPrefix(); 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => User::class, 
     )); 
    } 
} 

FileUploader.php

namespace UserBundle\Service; 

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->getTargetDir(), $fileName); 
     return $fileName; 
    } 

    public function getTargetDir() 
    { 
     return $this->targetDir; 
    } 
} 

ImageUploadListener

namespace UserBundle\EventListener; 

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

class ImageUploadListener 
{ 
    private $uploader; 
    private $fileName; 

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

    public function prePersist(LifecycleEventArgs $args) 
    { 
     $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 User entities 
     if (!$entity instanceof User) { 
      return; 
     } 

     $file = $entity->getImage(); 

     // only upload new files 
     if ($file instanceof UploadedFile) { 
      $fileName = $this->uploader->upload($file); 
     } 

     $entity->setImage($fileName); 
    } 
} 

services.yml

parameters: 
    #parameter_name: value 
services: 
    _defaults: 
     autowire: true 
     autoconfigure: true 
     public: false 
    AppBundle\: 
     resource: '../../src/AppBundle/*' 
     exclude: '../../src/AppBundle/{Entity,Repository,Tests}' 
    AppBundle\Controller\: 
     resource: '../../src/AppBundle/Controller' 
     public: true 
     tags: ['controller.service_arguments'] 
    app.form.registration: 
     class: UserBundle\Form\RegistrationType 
     tags: 
      - { name: form.type, alias: app_user_registration }   
    UserBundle\Service\FileUploader: 
     arguments: 
      $targetDir: '%images_directory%'    
    UserBundle\EventListener\ImageUploadListener: 
     tags: 
      - { name: doctrine.event_listener, event: prePersist } 
      - { name: doctrine.event_listener, event: preUpdate } 

config.yml

fos_user: 
    db_driver: orm 
    firewall_name: main 
    user_class: UserBundle\Entity\User 
    service: 
     mailer: fos_user.mailer.twig_swift 
    from_email: 
     address: "%mailer_user%" 
     sender_name: "%mailer_user%" 
    registration: 
     form: 
      type: UserBundle\Form\RegistrationType 
     confirmation: 
      enabled: true 
      template: '@FOSUser/Registration/email.txt.twig' 
      from_email: 
       address: "%mailer_user%" 
       sender_name: "%mailer_user%" 
    profile: 
     form: 
      type: UserBundle\Form\EditType 

答えて

1

あなたのイベントは、ユーザーを保存するたびに起動されます。ユーザーアカウントを有効にすると、データベース内のユーザーをdoctrineで更新し、preUpdateイベントが呼び出されるようにします。

あなたがこれを行う必要があり予告避けるために:

// only upload new files 
if ($file instanceof UploadedFile) { 
    $fileName = $this->uploader->upload($file); 
    $entity->setImage($fileName); 
} 

をして、ファイルをアップロードしたり、使用するのではなく、それをアップロードするレジスタの動作を無効にすでにあるかどうかをチェックする必要があるたびに、あなたのアップローダーを呼び出すために避けるために、これを行う教義イベント

+0

ありがとう、親愛なるconfrère:-)そしてそれは動作します!しかし、私はあなたの答えの残りの部分を完全に理解していません。私がしたいことをするために間違ったパターンに従うと思いますか?コードをどのようにアップグレードできますか? –

+0

ユーザの登録は画像のアップロードとは別にできるので、イベントを使うのは良い選択ですが、できる限り多くのデフォルトのsymfony/doctrineイベントを避けるようにしています。エンティティを更新するたびにpreUpdateが呼び出されます...コードをアップグレードする場合は、[カスタムイベント]を送信することができます(https://stackoverflow.com/questions/11661057/how-to-create- custom-event-in-symfony2)を登録してください。 –

+0

ありがとう –

関連する問題