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'] 给了您错误。

希望对您有所帮助。