我在symfony 2.3项目上有一个问题。这个问题在表单处理程序中。我如何检索实体对象来持久化它?我尝试了"$this->form->getData();"方法,但它抛出了这个错误:"EntityManager#persist()期望参数1是一个实体对象,数组给定。"这里的代码,我使用:
<?php
namespace Foobar'CarBundle'Form'Handler;
use Symfony'Component'Form'Form;
use Symfony'Component'HttpFoundation'Request;
use Doctrine'ORM'EntityManager;
class CarHandler {
protected $request;
protected $form;
protected $em;
public function __construct(Form $form, Request $request, EntityManager $em) {
$this->form = $form;
$this->request = $request;
$this->em = $em;
}
/**
* Process form
*
* @return boolean
*/
public function process() {
if ('POST' == $this->request->getMethod()) {
$this->form->handleRequest($this->request);
$data = $this->form->getData();
$this->onSuccess($data);
return true;
}
return false;
}
public function onSuccess($entity) {
//pb here : EntityManager#persist() expects parameter 1 to be an entity object, array given.
//how to access object ???
$this->em->persist($entity);
$this->em->flush();
}
}
实体:
<?php
namespace Foobar'CarBundle'Entity;
use Doctrine'ORM'Mapping as ORM;
/**
* Car
*
* @ORM'Table()
* @ORM'Entity(repositoryClass="Foobar'CarBundle'Entity'CarRepository")
*/
class Car
{
/**
* @var integer
*
* @ORM'Column(name="id", type="integer")
* @ORM'Id
* @ORM'GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM'Column(name="name", type="string", length=255)
*/
private $name;
/**
* @var string
*
* @ORM'Column(name="brand", type="string", length=255)
*/
private $brand;
/**
* @var string
*
* @ORM'Column(name="color", type="string", length=255)
*/
private $color;
/**
* @var integer
*
* @ORM'Column(name="power", type="integer")
*/
private $power;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set name
*
* @param string $name
* @return Car
*/
public function setName($name)
{
$this->name = $name;
return $this;
}
/**
* Get name
*
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* Set brand
*
* @param string $brand
* @return Car
*/
public function setBrand($brand)
{
$this->brand = $brand;
return $this;
}
/**
* Get brand
*
* @return string
*/
public function getBrand()
{
return $this->brand;
}
/**
* Set color
*
* @param string $color
* @return Car
*/
public function setColor($color)
{
$this->color = $color;
return $this;
}
/**
* Get color
*
* @return string
*/
public function getColor()
{
return $this->color;
}
/**
* Set power
*
* @param integer $power
* @return Car
*/
public function setPower($power)
{
$this->power = $power;
return $this;
}
/**
* Get power
*
* @return integer
*/
public function getPower()
{
return $this->power;
}
}
<?php
namespace Foobar'CarBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
class CarType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('name', null);
$builder->add('brand', null);
$builder->add('power', null);
$builder->add('color', null);
$builder->add('save', 'submit');
}
public function getName() {
return 'car';
}
}
在Symfony2中,你不必通过处理程序来处理表单,你可以直接在定义动作的控制器中处理它,这是一种更简单的编码方式,可以避免错误…
下面是一个在控制器中使用表单的动作示例:
<?php
namespace Acme'BlogBundle'controller;
use Symfony'Bundle'FrameworkBundle'Controller'Controller;
use Symfony'Component'HttpFoundation'Request;
use Symfony'Component'HttpFoundation'Response;
use Acme'BlogBundle'Form'UserType;
class DefaultController extends Controller
{
public function defaultAction()
{
$entity = new Entity();
$form = $this->createForm( new EntityType(), $entity);
$request = $this->get( 'request' );
if ( $request->getMethod() == 'POST' )
{
$form->bind( $request );
$em = $this->getDoctrine()->getManager();
if ( $form->isValid() ) {
$em->persist($feedback);
$em->flush();
}
}
return $this->render('AcmeBlogBundle:Default:default.html.twig', array( 'someValues' => $someValues, 'form' => $form->createView() ));
}
}
我传递我的对象实体直接保存在表单中与$this->createForm(),所以当表单被提交和授予(资产或如果所有必需的输入被填写)对象实体被填满表单值,并准备持久化和刷新。
你总是可以使用$entity->setVARIABLE()来更新或修改这个对象的值来保存它。
如果出于某种特殊原因,您仍然需要直接访问POST和/或GET值,则可以使用:
//GET
$request->query->get('foo');
//POST
$request->request->get('bar');