Symfony 2.3如何在表单处理程序中访问实体对象


symfony 2.3 how to access the entity object inside a form handler?

我在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');