表单提交错误data_class formview

时间:2015-11-27 08:57:35

标签: php symfony entity formbuilder

我有一个由formbuilder

构建的表单
public function buildForm(FormBuilderInterface $builder, array $options){
    $query = $this->em->createQueryBuilder();
    $query->select('sn.serial_nr')
          ->from('KopictAdminBundle:SerialNumber', 'sn');

    $serialnumbers = $query->getQuery()->getResult();

    $options = array();
    foreach($serialnumbers as $serialnumber){
        $options[$serialnumber['serial_nr']] = $serialnumber['serial_nr'];
    }

    $builder->add("serial_nr","text");
}

它正确显示表单,但是当我提交表单时,我收到此错误:

"The form's view data is expected to be an instance of class Kopict\AdminBundle\Entity\SerialNumber, but is  a(n) string. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms  a(n) string to an instance of Kopict\AdminBundle\Entity\SerialNumber." at /var/www/kopadmin/vendor/symfony/symfony/src/Symfony/Component/Form/Form.php line 373

这就是我的实体的样子:

class SerialNumber
{
    /**
     * @var integer $id
     */
    private $id;

    /**
     * @var interger $product_revision_id
     */
    private $product_revision_id;

    /**
     * @var interger $booking_id
     */
    private $booking_id;

    /**
     * @var string $serial_nr
     */
    public $serial_nr;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set product_revision_id
     *
     * @param integer $product_revision_id
     * @return SerialNumber
     */
    public function setProduct_revision_id($product_revision_id)
    {
        $this->product_revision_id = $product_revision_id;

        return $this;
    }

    /**
     * Get product_revision_id
     *
     * @return integer 
     */
    public function getProduct_revision_id()
    {
        return $this->product_revision_id;
    }

    /**
     * Set booking_id
     *
     * @param integer $booking_id
     * @return SerialNumber
     */
    public function setBooking_id($booking_id)
    {
        $this->booking_id = $booking_id;

        return $this;
    }

    /**
     * Get booking_id
     *
     * @return integer 
     */
    public function getBooking_id()
    {
        return $this->booking_id;
    }

    /**
     * Set serial_nr
     *
     * @param string $serial_nr
     * @return SerialNumber
     */
    public function setSerial_nr($serial_nr)
    {
        $this->serial_nr = $serial_nr;

        return $this;
    }

    /**
     * Get serial_nr
     *
     * @return string 
     */
    public function getSerial_nr()
    {
        return $this->serial_nr;
    }
}

我试图添加data_class,但我找不到添加它的好地方,因为代码一直给我同样的错误。

1 个答案:

答案 0 :(得分:0)

首先,您需要设置serial_nr private,否则无需拥有getSerial_nrsetSerial_nr功能。因为你可以在没有制定者和吸气剂的情况下到达课外的serial_nr

其次,为什么要将serial numbers添加到选项字段中?

假设您希望将serial numbers作为选择字段。我有一个解决方案。

通常,实体在Doctrine ORM中与many-to-one one-to-many相关联。在这种情况下,将相关字段作为选择字段非常简单。对于这种情况,symfony有一个内置的entity字段。

SerialNumberType - 表单类型类。 (您必须将此名称更改为您的名称)

    <?php

namespace Kopict\AdminBundle\Form;

use Doctrine\ORM\em;
use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class SerialNumberType extends AbstractType
{

    private $em;

    public function __construct(EntityManager $em)
    {
        $this->em = $em;
    }


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $query = $this->em->createQueryBuilder();
        $query->select('sn.serial_nr')->from('KopictAdminBundle:SerialNumber', 'sn');

        $serialNumbers = $query->getQuery()->getResult();
        $choices       = array();
        foreach ($serialNumbers as $serialNumber) {
            $choices[$serialNumber['serial_nr']] = $serialNumber['serial_nr'];
        }
        $builder->add("serial_nr", "choice", array(
            'choices' => $choices,
        ));
    }

    public function getName()
    {
        return 'app_bundle_serial_number_type';
    }
}

内部控制器操作

    <?php

namespace Kopict\AdminBundle\Controller;

use Kopict\AdminBundle\Entity\SerialNumber;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class DefaultController extends Controller
{
    public function indexAction()
    {
        $serialNumber = new SerialNumber();
        $form = $this->createForm($this->get('kopict_admin.form.serialnumber'), $serialNumber);

        return $this->render('KopictAdminBundle:Default:index.html.twig', array('form' => $form->createView()));
    }
}

<强> services.yml

services:
    kopict_admin.form.serialnumber:
        class: Kopict\AdminBundle\Form\SerialNumberType
        arguments: [ @doctrine.orm.entity_manager ]
        scope: request