2016-03-24 10 views
0

私のsymfony3アプリケーション用のシンプルなコントローラでFOSUserBundleを使ってユーザーの電子メールアドレスを更新していました。Symfony 3 FOSUserBundle 'エラー:タイプがAppBundle Entity Userのオブジェクトを配列として使用できません'

$user = $this->getUser(); 
$user->setEmail($email); 

このエラーを2行目に返します。

Error: Cannot use object of type AppBundle\Entity\User as array 

私は明らかに、配列としてオブジェクトを使用して、私はBaseUserクラスのメソッドを使用していますことを考えると、私はそれがこのエラーを投げている理由と途方に暮れていますていませんよ。

EDIT:

コントローラ

/** 
* @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']); 
+0

何かが原因で、エラーが発生している場所ではないと思われます。完全なスタックトレースとこのエラーが発生しているファイル全体をポストできますか? – Squeegy

+0

私は私の編集を編集しました。 –

答えて

0

を言っています。

symfonyでは、エンティティを使用してフォームを作成すると、フォームメソッドgetData()は元々渡されたエンティティを返します。既にエンティティ(オブジェクト)を持っている場合は、getData()に電話する必要はありません。また、handleRequest()はフォームに基づいてエンティティの値を変更しました。フォームフィールドで、オプションに'mapped' => falseを指定していない限り。あなたが最後$data = $form->getData()でドキュメントhttp://symfony.com/doc/current/book/forms.html

内のすべての本以上を見つけることができます

/** 
* @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(), 
    )); 
} 

は、ユーザーエンティティを返していましたので、$data['email']はあなたにエラーを与えていました。

これが役に立ちます。

+0

それははるかに理にかなって、事をもっと簡単にします。ありがとう!コードを整理する時間。 –

0

$data = $email_form->getData();

0であります
$user->setEmail($data['email']); 

Symfony\Component\Debug\Exception\FatalErrorException: Error: Cannot use object of type AppBundle\Entity\User as array

最初の答えに展開する

(申し訳ありませんが、短い答え)... $dataは、エンティティ・ユーザーであることを

関連する問題