2016-03-24 8 views
0

Ich arbeitete an einem einfachen Controller für meine Symfony3-App mit FOSUserBundle, um die E-Mail-Adresse des Benutzers zu aktualisieren.Symfony 3 FOSUserBundle Fehler: Objekt des Typs AppBundle Entity User kann nicht als Array verwendet werden

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

Gibt diesen Fehler in der zweiten Zeile zurück.

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

Ich verwende eindeutig nicht das Objekt als Array bedenken, dass ich eine Methode der BaseUser Klasse verwenden, so ich bin ratlos mit, warum es diesen Fehler zu werfen.

EDIT:

-Controller

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

Stack Trace

[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 

Die Linie 114 ist

$user->setEmail($data['email']); 
+0

Etwas führt mich zu der Annahme, dass hier nicht der Fehler auftritt. Können Sie den vollständigen Stack-Trace und die gesamte Datei, in der dieser Fehler auftritt, posten? – Squeegy

+0

Ich habe meinen OP bearbeitet. –

Antwort

0

auf der ersten Antwort zu erweitern.

Wenn Sie in Symfony ein Formular mit einer Entität erstellen, gibt die Formularmethode getData() die Entität zurück, die ursprünglich an sie übergeben wurde. Wenn Sie also diese Entität (Objekt) bereits haben, müssen Sie nicht anrufen getData() Auch die handleRequest() hat bereits die Werte der Entität für Sie basierend auf Ihrem Formular geändert. Sofern Sie nicht im Formularfeld 'mapped' => false in den Optionen angegeben haben.

Beispiel

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

Sie all dies und mehr in der Dokumentation zu Ihrem Benutzer Entity http://symfony.com/doc/current/book/forms.html

Am Ende $data = $form->getData() zurückkehren, finden $data['email'] wurde die Sie so den Fehler.

Hoffe, das hilft.

+0

Das macht viel mehr Sinn und macht die Dinge viel einfacher. Es funktioniert jetzt super, Danke! Zeit, den Code aufzuräumen. –

0

$data = $email_form->getData();

$user->setEmail($data['email']); 

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

Es ist zu sagen, dass $data Ihr Unternehmen Mitglied ist ...

(sorry, kurze Antwort)

Verwandte Themen