我有一个symfony表单,由于某种原因无法构建它应该构建的对象,因此当我在控制器中调用EntityManager#persist() expects parameter 1 to be an entity object, array given.
时,我得到$manager->persist($form->getData());
。
现在我几乎确信问题来自于我的实体的构建方式,但我无法弄清楚什么是错误的。
class EtatSuiviDossierType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $option)
{
$builder
->add('nom', TextType::class, array(
'required' => true
))
->add('task', EntityType::class, array(
'class' => 'AppBundle:Task',
'choice_label' => function ($task)
{
return $task->getName();
}
,'label' => 'Tâche (Optionnelle)'
))
->add('btnAction', SubmitType::class);
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Task'
));
}
}
/**
* @Doctrine\Entity
* @Doctrine\Table(name="EtatSuivisDossiers")
*/
class EtatSuiviDossier
{
/**
* @Doctrine\Column(name="id", type="integer")
* @Doctrine\Id
* @Doctrine\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Doctrine\Column(name="nom", type="string", length=100)
* @Assert\NotBlank(message="Le nom de l'état est obligatoire")
*/
private $nom;
/**
* @Doctrine\OneToOne(targetEntity="Task")
* @Doctrine\JoinColumn(name="idTask", referencedColumnName="id")
*/
private $task;
public function __construct($nom) {
$this->nom = $nom;
}
public function __toString()
{
return strval( $this->getId() );
}
public function getId() { return $this->id; }
public function getNom() { return $this->nom; }
public function getTask() { return $this->task; }
public function setId($id) { $this->id = $id; return $this; }
public function setNom($nom) { $this->nom = $nom; return $this; }
public function setTask($task) { $this->task = $task; return $this; }
}
/**
* @Doctrine\Entity
* @Doctrine\Table(name="Tasks")
*/
class Task
{
/**
* @Doctrine\Column(name="id", type="integer")
* @Doctrine\Id
* @Doctrine\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @Doctrine\Column(name="name", type="text", length=100)
* @Assert\NotBlank()
*/
protected $name;
/**
* @Doctrine\ManyToMany(targetEntity="TaskEmail")
* @Doctrine\JoinTable(name="Tasks_Tasks_Emails",
* joinColumns={@Doctrine\JoinColumn(name="idTask", referencedColumnName="id")},
* inverseJoinColumns={@Doctrine\JoinColumn(name="idTaskEmail", referencedColumnName="id")}
* )
*/
private $emails;
/**
* @Doctrine\Column(name="subject", type="text", length=78)
* @Assert\NotBlank()
*/
protected $subject;
/**
* @Doctrine\Column(name="message", type="text")
* @Assert\NotBlank()
*/
protected $message;
/**
* @Doctrine\ManyToOne(targetEntity="SuiviDossier")
* @Doctrine\JoinColumn(name="idSuiviDossier", referencedColumnName="idFichier")
*/
protected $suiviDossier;
/**
* @Doctrine\Column(name="type", type="integer")
*/
protected $type;
/**
* @Doctrine\Column(name="executeDate", type="datetime")
*/
protected $executeDate;
/**
* @Doctrine\Column(name="timer", type="time")
*/
protected $timer;
public function __construct($subject, $message)
{
$this->subject = $subject;
$this->message = $message;
$this->emails = new ArrayCollection();
}
public function getId() { return $this->id; }
public function getName() { return $this->name; }
public function getEmails() { return $this->emails; }
public function getSubject() { return $this->subject; }
public function getMessage() { return $this->message; }
public function getExecuteDate() { return $this->executeDate; }
public function getTimer() { return $this->timer; }
public function getSuiviDossier() { return $this->suiviDossier; }
public function setId($id) { $this->id = $id; return $this; }
public function setName($name) { $this->name = $name; return $this; }
public function setEmails($emails) { $this->emails = $emails; return $this; }
public function setMessage($message) { $this->message = $message; return $this; }
public function setSubject($subject) { $this->subject = $subject; return $this; }
public function setExecuteDate($executeDate) { $this->executeDate = $executeDate; return $this; }
public function setTimer($timer) { $this->timer = $timer; return $this; }
public function setSuiviDossier($suiviDossier) { $this->suiviDossier = $suiviDossier; return $this; }
}
/**
* @Route("/Suivi/Dossier/Etat/Ajouter", name="SuiviDossier.Etat.Ajout")
* @Security("has_role('ROLE_ADMIN')")
*/
public function EtatAjout(Request $request)
{
try
{
$manager = $this->getDoctrine()->getManager();
$form = $this->createForm(EtatSuiviDossierType::class);
$form->handleRequest($request);
if($form->isSubmitted() && $form->isValid())
{
$manager->persist($form->getData());
$manager->flush();
return $this->redirectToRoute('SuiviDossier.Etat');
}
return $this->render('suiviDossier/etat/suiviDossier.etat.ajout.html.twig', array(
'form' => $form->createView())
);
}
catch (\Exception $e)
{
$message = new Message(MessageType::DANGER, $e->getMessage());
$this->addFlash('message', $message);
return $this->render('erreur.html.twig', array('message' => $message));
}
}
我的实体是否正确构建? 感谢任何能提供任何建议的人!
我必须从我的控制器
中初始化我的表单$etatSuiviDossier = new EtatSuiviDossier("");
$form = $this->createForm(EtatSuiviDossierType::class, $etatSuiviDossier);
答案 0 :(得分:1)
在Controller中创建表单时,您应该在其中传递一个新的实体:
$etatSuiviDossier = new EtatSuiviDossier();
$form = $this->createForm(EtatSuiviDossierType::class, $etatSuiviDossier);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$etatSuiviDossier // here is your entity with formdata
// save your entity
$em = $this->getDoctrine()->getManager();
$em->persist($etatSuiviDossier);
$em->flush();
}
实体自动填充。