Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 表单提交错误数据\u类表单视图_Php_Symfony_Entity_Formbuilder - Fatal编程技术网

Php 表单提交错误数据\u类表单视图

Php 表单提交错误数据\u类表单视图,php,symfony,entity,formbuilder,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');

我有一个由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_类,但是我找不到添加它的好位置,因为代码总是给我相同的错误。

首先,您需要将您的
serial_nr
设为private
否则不需要
getSerial_nr
setSerial_nr
函数。因为您可以在类外访问
serial\u nr
,而无需设置setter和getter

第二,为什么要将序列号添加到选项字段中

假设您希望将
序列号
作为选择字段。我有一个解决办法给你

通常,实体在
规则中关联为
多对一
一对多
。在这种情况下,获取相关字段作为选择字段非常简单。对于这种情况,symfony有一个内置字段

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:
    kopict_admin.form.serialnumber:
        class: Kopict\AdminBundle\Form\SerialNumberType
        arguments: [ @doctrine.orm.entity_manager ]
        scope: request