Форма не сохранится в Symfony2 - PullRequest
0 голосов
/ 26 марта 2012

Я хочу сохранить форму в Symfony2 на основе типа формы, но метод save() не найден.

Сообщение об ошибке:

Фатальная ошибка: вызов неопределенного метода Symfony \ Component \ Form \ Form :: save () в C: \ xampp \ htdocs \ Xq \ src \ Xq \ LogBundle \ Controller \ LogController.php в строке 44

Контроллер, который вызывает метод сохранения, выглядит следующим образом:

<?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()));
        }
}
?>

CallType определяется следующим образом:

<?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';
    }
}
?>

И, наконец, есть класс сущности "Вызов", который также отлично работает:

<?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...

}

Кто-нибудь знает, почему метод сохранения не найден? Метод bind() не вызывает ошибку, поэтому, я думаю, должен быть действительный объект формы.

1 Ответ

4 голосов
/ 26 марта 2012

Формы не несут ответственности за сохраняющиеся объекты; они отвечают за вывод полей формы со значениями из объекта и ввод пользовательского ввода в этот объект при отправке формы.

Используйте Доктрину, чтобы сохранить ваши объекты. Вот фрагмент кода из раздела Forms and Doctrine , адаптированный для вашего примера:

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