Symfony 3表单不返回对象

时间:2017-09-04 18:28:25

标签: php forms symfony doctrine

我有一个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));
    }
}

我的实体是否正确构建? 感谢任何能提供任何建议的人!

TL; DR

我必须从我的控制器

中初始化我的表单
$etatSuiviDossier = new EtatSuiviDossier("");
$form = $this->createForm(EtatSuiviDossierType::class, $etatSuiviDossier);

1 个答案:

答案 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();

}

实体自动填充。