私は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
ありがとう、親愛なるconfrère:-)そしてそれは動作します!しかし、私はあなたの答えの残りの部分を完全に理解していません。私がしたいことをするために間違ったパターンに従うと思いますか?コードをどのようにアップグレードできますか? –
ユーザの登録は画像のアップロードとは別にできるので、イベントを使うのは良い選択ですが、できる限り多くのデフォルトのsymfony/doctrineイベントを避けるようにしています。エンティティを更新するたびにpreUpdateが呼び出されます...コードをアップグレードする場合は、[カスタムイベント]を送信することができます(https://stackoverflow.com/questions/11661057/how-to-create- custom-event-in-symfony2)を登録してください。 –
ありがとう –