Symfony 3 FOSUserBundle 'Error: Cannot use object of type AppBundle\Entity\User as array'
Symfony 3 FOSUserBundle 'Error: Cannot use object of type AppBundle\Entity\User as array'
我正在使用 FOSUserBundle 为我的 Symfony3 应用开发一个简单的控制器来更新用户的电子邮件地址。
$user = $this->getUser();
$user->setEmail($email);
Returns 这个错误在第二行。
Error: Cannot use object of type AppBundle\Entity\User as array
考虑到我正在使用 BaseUser class 的方法,我显然没有将该对象用作数组,所以我不知道为什么会抛出此错误。
编辑:
控制器
/**
* @Route("/portfolio/settings", name="portfolio_settings")
*/
public function settingsAction(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$email_form = $this->get('form.factory')->createNamedBuilder('change_email', FormType::class, $user)
->add('email', EmailType::class, array(
'label' => 'E-Mail',
))
->add('save', SubmitType::class, array(
'label' => 'Save'
))
->getForm();
$password_form = $this->get('form.factory')->createNamedBuilder('change_password', FormType::class, $user)
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'The password fields must match.',
'options' => array('attr' => array('class' => 'password-field')),
'required' => true,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
])
->add('save', SubmitType::class)
->getForm();
$email_form->handleRequest($request);
$password_form->handleRequest($request);
if($email_form->isValid()){
$data = $email_form->getData();
$user->setEmail($data['email']);
$em->persist($user);
$this->addFlash(
'success',
'Your E-Mail address has been updated successfully'
);
}
$em->flush();
return $this->render('AppBundle:Portfolio:settings.html.twig', array(
'email' => $email_form->createView(),
'password' => $password_form->createView(),
));
}
堆栈跟踪
[1] Symfony\Component\Debug\Exception\FatalErrorException: Error: Cannot use object of type AppBundle\Entity\User as array
at n/a
in /var/www/html/scnce/src/AppBundle/Controller/PortfolioController.php line 114
第 114 行是
$user->setEmail($data['email']);
$data = $email_form->getData();
$user->setEmail($data['email']);
Symfony\Component\Debug\Exception\FatalErrorException: Error: Cannot
use object of type AppBundle\Entity\User as array
意思是 $data
是您的实体用户 ...
(抱歉,简短回答)
扩展第一个答案。
在 Symfony 中,当您使用实体创建表单时,表单方法 getData()
将 return 最初传递给它的实体。因此,如果您已经拥有该实体(对象),则无需调用 getData()
而且 handleRequest()
已经根据您的表单为您更改了实体的值。除非您在表单字段中的选项中指定了 'mapped' => false
。
例子
/**
* @Route("/portfolio/settings", name="portfolio_settings")
*/
public function settingsAction(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$email_form = $this->get('form.factory')->createNamedBuilder('change_email', FormType::class, $user)
->add('email', EmailType::class, array(
'label' => 'E-Mail',
))
->add('save', SubmitType::class, array(
'label' => 'Save'
))
->getForm();
$email_form->handleRequest($request);
if($email_form->isValid()){
// Here we can persist the user, it's field for email have already been modified by ->handleRequest($request);
// In fact if you var_dump($user->getEmail()) you'll see it's already your new value.
$em->persist($user);
$this->addFlash(
'success',
'Your E-Mail address has been updated successfully'
);
// I moved your flush here, because it's more appropriate to only flush when we've actually made a change.
$em->flush();
}
return $this->render('AppBundle:Portfolio:settings.html.twig', array(
'email' => $email_form->createView(),
'password' => $password_form->createView(),
));
}
您可以在文档中找到所有这些以及更多内容 http://symfony.com/doc/current/book/forms.html
最后 $data = $form->getData()
是 return 您的用户实体,所以 $data['email']
给了您错误。
希望对您有所帮助。
我正在使用 FOSUserBundle 为我的 Symfony3 应用开发一个简单的控制器来更新用户的电子邮件地址。
$user = $this->getUser();
$user->setEmail($email);
Returns 这个错误在第二行。
Error: Cannot use object of type AppBundle\Entity\User as array
考虑到我正在使用 BaseUser class 的方法,我显然没有将该对象用作数组,所以我不知道为什么会抛出此错误。
编辑:
控制器
/**
* @Route("/portfolio/settings", name="portfolio_settings")
*/
public function settingsAction(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$email_form = $this->get('form.factory')->createNamedBuilder('change_email', FormType::class, $user)
->add('email', EmailType::class, array(
'label' => 'E-Mail',
))
->add('save', SubmitType::class, array(
'label' => 'Save'
))
->getForm();
$password_form = $this->get('form.factory')->createNamedBuilder('change_password', FormType::class, $user)
->add('password', RepeatedType::class, [
'type' => PasswordType::class,
'invalid_message' => 'The password fields must match.',
'options' => array('attr' => array('class' => 'password-field')),
'required' => true,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
])
->add('save', SubmitType::class)
->getForm();
$email_form->handleRequest($request);
$password_form->handleRequest($request);
if($email_form->isValid()){
$data = $email_form->getData();
$user->setEmail($data['email']);
$em->persist($user);
$this->addFlash(
'success',
'Your E-Mail address has been updated successfully'
);
}
$em->flush();
return $this->render('AppBundle:Portfolio:settings.html.twig', array(
'email' => $email_form->createView(),
'password' => $password_form->createView(),
));
}
堆栈跟踪
[1] Symfony\Component\Debug\Exception\FatalErrorException: Error: Cannot use object of type AppBundle\Entity\User as array
at n/a
in /var/www/html/scnce/src/AppBundle/Controller/PortfolioController.php line 114
第 114 行是
$user->setEmail($data['email']);
$data = $email_form->getData();
$user->setEmail($data['email']);
Symfony\Component\Debug\Exception\FatalErrorException: Error: Cannot use object of type AppBundle\Entity\User as array
意思是 $data
是您的实体用户 ...
(抱歉,简短回答)
扩展第一个答案。
在 Symfony 中,当您使用实体创建表单时,表单方法 getData()
将 return 最初传递给它的实体。因此,如果您已经拥有该实体(对象),则无需调用 getData()
而且 handleRequest()
已经根据您的表单为您更改了实体的值。除非您在表单字段中的选项中指定了 'mapped' => false
。
例子
/**
* @Route("/portfolio/settings", name="portfolio_settings")
*/
public function settingsAction(Request $request)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$email_form = $this->get('form.factory')->createNamedBuilder('change_email', FormType::class, $user)
->add('email', EmailType::class, array(
'label' => 'E-Mail',
))
->add('save', SubmitType::class, array(
'label' => 'Save'
))
->getForm();
$email_form->handleRequest($request);
if($email_form->isValid()){
// Here we can persist the user, it's field for email have already been modified by ->handleRequest($request);
// In fact if you var_dump($user->getEmail()) you'll see it's already your new value.
$em->persist($user);
$this->addFlash(
'success',
'Your E-Mail address has been updated successfully'
);
// I moved your flush here, because it's more appropriate to only flush when we've actually made a change.
$em->flush();
}
return $this->render('AppBundle:Portfolio:settings.html.twig', array(
'email' => $email_form->createView(),
'password' => $password_form->createView(),
));
}
您可以在文档中找到所有这些以及更多内容 http://symfony.com/doc/current/book/forms.html
最后 $data = $form->getData()
是 return 您的用户实体,所以 $data['email']
给了您错误。
希望对您有所帮助。