gpt4 book ai didi

php - 不允许序列化 'Symfony\Component\HttpFoundation\File\File',Symfony4

转载 作者:行者123 更新时间:2023-12-03 23:22:06 25 4
gpt4 key购买 nike

我已将头像图片添加到我的 User类(class)。当我想呈现我的编辑表单时,我收到了这个错误

Serialization of 'Symfony\Component\HttpFoundation\File\File' is not allowed



我试图通过实现 \Serializable 来解决问题在我的 User根据 Symfony Official Documentation 分类.但是当我实现它时,它重定向到登录页面和 Authentication转至 anon.并通过再次登录,它再次重定向到登录页面并停留 anon.也。

I should mention that I have set some Authorizations. It will redirect you to the log in page if you are "anon." and want to access some protected routes.



这是我的 UserEntity , 用户.php:
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;


/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="user")
* @UniqueEntity(fields={"username"}, message="This username has been taken!")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string", unique=true,length=191)
* @Assert\NotBlank()
* @Assert\Length(min="5", minMessage="Username most contain at least 5 characters!")
*/
private $username;

/**
* @ORM\Column(type="string")
*/
private $password;

/**
* @ORM\Column(type="string")
*/
private $displayName;

/**
* @ORM\Column(type="boolean")
*/
private $showAdminBar;

/**
* @ORM\OneToMany(targetEntity="Post", mappedBy="owner")
*/
private $posts;

/**
* @ORM\Column(type="string")
*/
private $avatar;

/**
* @Assert\NotBlank(groups={"Registration"})
* @Assert\Length(min="6", minMessage="Password most contain at least 6 characters!")
*/
private $plainPassword;

public function getUsername()
{
return $this->username;
}

public function getRoles()
{
return ['ROLE_ADMIN'];
}

public function getPassword()
{
return $this->password;
}

public function getSalt()
{
}

public function eraseCredentials()
{
$this->plainPassword = null;
}

public function serialize()
{
return serialize(array(
$this->id,
$this->username,
$this->displayName,
$this->avatar,
// see section on salt below
// $this->salt,
));
}

/**
* @param mixed $username
*/
public function setUsername($username)
{
$this->username = $username;
}

/**
* @param mixed $password
*/
public function setPassword($password)
{
$this->password = $password;
}

/**
* @return mixed
*/
public function getPlainPassword()
{
return $this->plainPassword;
}

/**
* @param mixed $plainPassword
*/
public function setPlainPassword($plainPassword)
{
$this->plainPassword = $plainPassword;
//To make sure that Doctrine see the entity as "dirty"
$this->password = null;
}

/**
* @return mixed
*/
public function getDisplayName()
{
return $this->displayName;
}

/**
* @param mixed $displayName
*/
public function setDisplayName($displayName)
{
$this->displayName = $displayName;
}

/**
* @return mixed
*/
public function getShowAdminBar()
{
return $this->showAdminBar;
}

/**
* @param mixed $showAdminBar
*/
public function setShowAdminBar($showAdminBar)
{
$this->showAdminBar = $showAdminBar;
}

/**
* @return mixed
*/
public function getPosts()
{
return $this->posts;
}

/**
* @param mixed $posts
*/
public function setPosts($posts)
{
$this->posts = $posts;
}

/**
* @return mixed
*/
public function getAvatar()
{
return $this->avatar;
}

/**
* @param mixed $avatar
*/
public function setAvatar($avatar)
{
$this->avatar = $avatar;
}

/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}
}

这是我的 UserController.php
<?php

namespace App\Controller\Admin;

use App\Constants;
use App\Entity\User;
use App\Form\UserType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Component\HttpFoundation\File\File;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;


/**
* @Route("/admin/user")
* @Security("is_granted('ROLE_ADMIN')")
*/
class UserController extends Controller
{
/**
* @Route("/profile", name="admin_user_profile")
*/
public function profileAction(Request $request)
{
$user = $this->getUser();

$user->setAvatar(
new File(Constants::UPLOAD_AVATAR.'/'.$user->getAvatar())
);


$form = $this->createForm(UserType::class, $user);

$form->handleRequest($request);

if ($form->isSubmitted() && $form->isValid()) {
$user = $form->getData();


$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();

$this->addFlash('success', 'Your Info Has Been Updated!');

return $this->redirectToRoute('admin');
}


return $this->render('admin/user/profile.html.twig', [
'user' => $user,
'form' => $form->createView()
]);
}

/**
* @Route("/list", name="admin_user_list")
*/
public function listAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$users = $em->getRepository(User::class)
->findAll();

return $this->renderView('admin/user/list.html,twig',[
'users' => $users
]);
}
}

这是我的 UserForm , 用户类型.php
<?php

namespace App\Form;

use App\Entity\User;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('displayName')
->add('plainPassword', RepeatedType::class, [
'type' => PasswordType::class
])
->add('avatar',FileType::class)
;
}

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

最佳答案

经过一些调试后,我自己找到了解决方案。

问题是,当 User实体正在实现 UserInterface ,用户提供者(实际上是 Doctrine,幕后)试图序列化 User对象将它存储在 session 中,但由于我将它分配给这个类的文件,它失败了!

为了解决这个问题,我首先尝试获取单独的 User来自数据库的对象,但不幸的是,Doctrine 给了我 User 的确切引用。再次对象。(这不是错误。感谢 Doctrine。尽可能少地查询太聪明了)。

二、本人clone User在将它发送到 UserType 之前,在 Controller 中对象我自己形式,然后一切顺利。

But that is not the best practice because you may have some other problems with registration, profile update or other scenarios that you may have with User class.



在我的应用程序中,我添加了另一个名为 Media 的实体。并将文件与文件系统和每个实体一起存储,如 User需要一些媒体(比如这里的用户头像),只需一个 ManyToOne与该实体的关系。在这种情况下,您可以将名称文件保存为 string在头像字段中 User类(class)。

您的应用程序中可能还有其他一些设计,但正如我所经历的, 不要分配 File字段直接到User正在实现的实体 UserInterface !

关于php - 不允许序列化 'Symfony\Component\HttpFoundation\File\File',Symfony4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49782167/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com