Soh*_*eil 4 php serialization image-uploading symfony4
我在User班级中添加了头像。当我想呈现我的编辑表单时,我收到了这个错误
'Symfony\Component\HttpFoundation\File\File' 的序列化是不允许的
我试图通过根据Symfony 官方文档\Serializable在我的User班级中实现来解决这个问题。但是,当我实现的是,它重定向到登录页面,而且转向,并通过日志记录再次,它重定向到登录页面,再次留下了。Authenticationanon.anon.
我应该提到我已经设置了一些授权。如果您是“匿名者”,它会将您重定向到登录页面。并且想要访问一些受保护的路由。
这是我的UserEntityUser.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;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 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
]);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的UserFormUserType.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,
]);
}
}
Run Code Online (Sandbox Code Playgroud)
经过一些调试后,我自己找到了解决方案。
问题是,当UserEntity 正在实现 时UserInterface,用户提供者(实际上是幕后的 Doctrine)尝试序列化User对象以将其存储在会话中,但由于我将其分配给此类的文件,它失败了!
为了解决这个问题,首先我尝试User从数据库中获取单独的对象,但不幸的是 DoctrineUser再次给了我对象的确切引用。(这不是一个错误。感谢 Doctrine。尽可能少地查询太聪明了)。
其次,我自己在控制器clone中将User对象发送到UserType表单之前,然后一切顺利。
但这不是最佳实践,因为您可能在注册、配置文件更新或
User课堂上可能遇到的其他情况下遇到其他一些问题。
在我的应用程序中,我添加了另一个名为的实体Media,它使用文件系统存储文件,每个实体User都需要一些媒体(如这里的用户头像),只需ManyToOne与该实体建立关系。在这种情况下,您可以将名称文件保存为课堂string中的头像字段User。
您的应用程序中可能还有其他一些设计,但正如我所经历的,不要将File字段直接分配给User正在实现的实体UserInterface!
| 归档时间: |
|
| 查看次数: |
6537 次 |
| 最近记录: |