我是Symfony 3的新用户,当我尝试激活我的帐户时,我遇到了问题。 我从FOSUserBundle扩展我的用户实体。我已经激活了FOS_User的确认系统。 此外,当用户注册我的应用程序时,他必须上传文件。为此,我创建了一个FileUploader服务和一个ImageUploadListener侦听器。 问题是当我从我的Gmail电子邮件中点击我的激活链接时,我收到以下错误:
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
答案 0 :(得分:1)
每次保存用户时都会启动您的活动。激活用户帐户时,您将使用数据库中的doctrine更新用户,以便调用preUpdate事件。
为避免通知你应该这样做:
// only upload new files
if ($file instanceof UploadedFile) {
$fileName = $this->uploader->upload($file);
$entity->setImage($fileName);
}
为避免每次上传时调用,您必须检查文件是否已上传或覆盖注册操作以上传它而不是使用doctrine事件来执行此操作