2012-03-26 15 views
0

Ich möchte ein Formular in Symfony2 speichern, basierend auf einem Formulartyp, aber die save() Methode wurde nicht gefunden.Formular wird nicht in Symfony2 gespeichert

Die Fehlermeldung lautet:

Fatal error: Call to undefined method Symfony\Component\Form\Form::save() in C:\xampp\htdocs\Xq\src\Xq\LogBundle\Controller\LogController.php on line 44

Der Controller, der die Methode sieht speichern ruft wie folgt:

<?php 

namespace Xq\LogBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\HttpFoundation\Request; 

use Doctrine\ORM\EntityRepository; 

use Xq\LogBundle\Entity\Call; 
use Xq\LogBundle\Form\Type\CallType; 

class LogController extends Controller 
{ 

     public function callAction(Request $request) 
     { 
       #create call object 
        $call = new Call(); 
        $now = new \DateTime("now"); 
        $call->setTimestamp($now); 
        $call_form = $this->createForm(new CallType(), $call); 
       #check form input 
        $request = $this->get('request'); 
        if ($request->getMethod() == 'POST') 
        { 
         $call_form->bindRequest($request); 
          if ($call_form->isValid()) 
          { 
           **$saved_call = $call_form->save();** 
          } 
        } 
       return $this->render('XqLogBundle:log:call.html.twig', array('call_form'=>$call_form->createView())); 
     } 
} 
?> 

Die Calltype wird wie folgt definiert:

<?php 

namespace Xq\LogBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class CallType extends AbstractType 
{ 
    public function buildForm(Formbuilder $builder, array $options) 
    { 
     //here all fields are defined, and they are rendered fine  
    } 

    public function getDefaultOptions(array $options) 
    { 
     return array('data_class' => 'Xq\LogBundle\Entity\Call'); 
    } 

    public function getName() 
    { 
     return 'callform'; 
    } 
} 
?> 

Und schließlich Es gibt eine Entitätsklasse "Call", die auch gut funktioniert:

<?php 

#ORM mapping of a call 

namespace Xq\LogBundle\Entity; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* 
* Xq\LogBundle\Entity\Call 
* 
* @ORM\Table(name="calls") 
* @ORM\Entity 
*/ 

class Call 
{ 
    #id of the call 
     /** 
     * @ORM\Id 
     * @ORM\Column(type="integer", length="7") 
     * @ORM\GeneratedValue(strategy="AUTO") 
     */ 
     protected $id; 

    #caller 
     /** 
     * @ORM\Column(name="caller", type="integer", length="3", nullable="false") 
     * @ORM\OneToOne(targetEntity="caller") 
     * @Assert\type(type="Xq\LogBundle\Entity\Caller") 
     */ 
     protected $caller; 

     // and so on .... 


    #getters and setters 

     /** 
     * Get id 
     * 
     * @return integer $id 
     */ 
     public function getId() 
     { 
       return $this->id; 
     } 

     // and so on... 

} 

Weiß jemand, warum die Speichermethode nicht gefunden wird? Die bind() Methode löst keinen Fehler aus, daher muss es ein gültiges Formularobjekt geben, denke ich.

Antwort

4

Formulare sind nicht für persistente Objekte verantwortlich; Sie sind verantwortlich für die Ausgabe von Formularfeldern mit Werten aus einem Objekt und die Eingabe von Benutzereingaben in dieses Objekt beim Senden von Formularen.

Verwenden Sie Doctrine, um Ihre Objekte zu erhalten. Hier ist das Code-Schnipsel aus dem Forms and Doctrine Abschnitt, angepasst für Ihr Beispiel:

if ($call_form->isValid()) { 
    $em = $this->getDoctrine()->getEntityManager(); 
    $em->persist($call); 
    $em->flush(); 
} 
+0

Danke elnur, dass tatsächlich das Problem gelöst. Obwohl ich zugeben muss, dass ich nicht verstehe, warum die Handbücher von Symfony2 schreiben von $ form-> save(). Ich muss mich über zwei getrennte Konzepte hier irritieren. –

Verwandte Themen