我正在尝试使用Symfony会话。事实上,我想在登录之前完成一个表单。
基于这个原因,我喜欢这样的方案:
- 保存会话中的不同字段 登录/注册
- 保存在数据库
My controller:
public function customMadeAction(Request $request)
{
$session = $this->container->get('session');
$user = $this->container->get('security.context')->getToken()->getUser();
$CustomMade = new CustomMade();
$form = $this->createForm(new CustomMadeType(), $CustomMade);
$form->handleRequest($request);
if ($user === 'anon.') {
if($form->isValid()) {
# 1-Save in session
var_dump($CustomMade); #I have an array with all I need
$session->set('infos', $CustomMade); #It does not save my informations
# 2-Redirect to login/register
$securityContext = $this->container->get('security.context');
if (!$securityContext->isGranted('ROLE_USER')) {
throw new AccessDeniedException('Accès refusé');
} else {
# 3-Save in database
$em = $this->getDoctrine()->getManager();
$em->persist($CustomMade);
$em->flush();
}
}
}else{
if($form->isValid()) {
$CustomMade->setIdUser($user->getId());
$em = $this->getDoctrine()->getManager();
$em->persist($CustomMade);
$em->flush();
}
}
return $this->render('FrontBundle:Forms:customMade.html.twig', array(
'form' => $form->createView()
));
}
我不认为你可以在会话中存储对象。以下是一些解决方案:
- 在会话中手动存储对象的每个字段
- 序列化对象并将其保存在会话
- 将其存储在数据库中,并标记它尚未附加到用户,并将id保存在会话 中。
在我看来,1是最快实现的,但如果以后向实体添加字段,维护它将是一件痛苦的事情。解决方案2更好,但是反序列化不是那么容易。我认为方案3是最好的,它实现起来并不复杂,也不会造成任何维护问题。
如果你想保存数据,只保存输入数据从表单(验证后),而不是整个实体(可能有很多…妈的,除非这是你想要的)。
你可以将对象/数组设置到会话中,Symfony会为你序列化和反序列化它
如果是这种情况,替换
$session->set('infos', $CustomMade);
$session->set('infos', $form->getData());
这样你以后就可以简单地做:
$data = $session->get('infos');
安托万的解决方案是正确的,
您必须序列化对象以便能够将其存储在会话中。
最简单的方法应该是使用JMSSerializerBundle和将对象解码为json:
$serializer = $this->container->get('serializer');
$jsonDecoded = $serializer->serialize($doctrineobject, 'json');
顺便说一句。如评论中所述,这将序列化连接到实体的整个学说结构。
然而,toArray()函数可以在实体中实现,以便仅序列化数组结构,但是在处理oneToOne oneToMany和manymany关系时,这种方法变得非常复杂