Symfony2嵌入表单集合


Symfony2 Embed a Collection of Forms

嗨,我对表单嵌入有问题。我有 3 个与关系一对多的类

盘点一对多盘点明细多对一硬件

呵,我提交表格,我收到错误。我不知道我在哪里犯了错误。

错误:

可捕获的致命错误:参数 1 传递给 AppBundle''Entity''MagazineStockTakingDetails::setHardware() 必须是 AppBundle''Entity''Hardware的实例,给定数组,调用 C:''Projekty''sla''vendor''symfony''symfony''src''Symfony''Component''PropertyAccess''PropertyAccessor.php 在第 442 行并定义

下面我过去编码我的类和表单。请帮我找到错误。

namespace AppBundle'Entity;
use Doctrine'ORM'Mapping as ORM;

/**
 * Class MagazineStockTaking
 * @package AppBundle'Entity
 * @ORM'Entity()
 * @ORM'Table(name="sla_stocktaking")
 */
class MagazineStockTaking
{
    /**
     * @ORM'Id
     * @ORM'Column(name="stockTakingId", type="integer", nullable=false)
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM'Column(name="stockinNumber", type="string", length=20, nullable=false)
     */
    protected $stockingnumber;
    /**
     * @ORM'Column(name="stockinDate", type="datetime", nullable=false)
     */
    protected $stockingdate;
    /**
     * @ORM'Column(name="stockingNote", type="string", length=1000, nullable=false)
     */
    protected $stockingnote;
    ////////////////////////////////////////////////
    // RELACJE
    ////////////////////////////////////////////////

    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'Magazine", inversedBy="stocktaking")
     * @ORM'JoinColumn(name="magazine_id", referencedColumnName="magazineId", nullable=false)
     */
    protected $magazine;
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'User", inversedBy="stocktaking")
     * @ORM'JoinColumn(name="user_id", referencedColumnName="userId", nullable=false)
     */
    protected $user;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'MagazineStockTakingDetails", mappedBy="stocktaking", cascade={"persist"})
     */
    protected $details;
    ////////////////////////////////////////////////
    // GET SET
    ////////////////////////////////////////////////
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->details = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set stockingnumber
     *
     * @param string $stockingnumber
     * @return MagazineStockTaking
     */
    public function setStockingnumber($stockingnumber)
    {
        $this->stockingnumber = $stockingnumber;
        return $this;
    }
    /**
     * Get stockingnumber
     *
     * @return string
     */
    public function getStockingnumber()
    {
        return $this->stockingnumber;
    }
    /**
     * Set stockingdate
     *
     * @param 'DateTime $stockingdate
     * @return MagazineStockTaking
     */
    public function setStockingdate($stockingdate)
    {
        $this->stockingdate = $stockingdate;
        return $this;
    }
    /**
     * Get stockingdate
     *
     * @return 'DateTime
     */
    public function getStockingdate()
    {
        return $this->stockingdate;
    }
    /**
     * Set stockingnote
     *
     * @param string $stockingnote
     * @return MagazineStockTaking
     */
    public function setStockingnote($stockingnote)
    {
        $this->stockingnote = $stockingnote;
        return $this;
    }
    /**
     * Get stockingnote
     *
     * @return string
     */
    public function getStockingnote()
    {
        return $this->stockingnote;
    }
    /**
     * Set magazine
     *
     * @param 'AppBundle'Entity'Magazine $magazine
     * @return MagazineStockTaking
     */
    public function setMagazine('AppBundle'Entity'Magazine $magazine)
    {
        $this->magazine = $magazine;
        return $this;
    }
    /**
     * Get magazine
     *
     * @return 'AppBundle'Entity'Magazine
     */
    public function getMagazine()
    {
        return $this->magazine;
    }
    /**
     * Set user
     *
     * @param 'AppBundle'Entity'User $user
     * @return MagazineStockTaking
     */
    public function setUser('AppBundle'Entity'User $user)
    {
        $this->user = $user;
        return $this;
    }
    /**
     * Get user
     *
     * @return 'AppBundle'Entity'User
     */
    public function getUser()
    {
        return $this->user;
    }
    /**
     * Add details
     *
     * @param 'AppBundle'Entity'MagazineStockTakingDetails $details
     * @return MagazineStockTaking
     */
    public function addDetail('AppBundle'Entity'MagazineStockTakingDetails $details)
    {
        $this->details[] = $details;
        return $this;
    }
    /**
     * Remove details
     *
     * @param 'AppBundle'Entity'MagazineStockTakingDetails $details
     */
    public function removeDetail('AppBundle'Entity'MagazineStockTakingDetails $details)
    {
        $this->details->removeElement($details);
    }
    /**
     * Get details
     *
     * @return 'Doctrine'Common'Collections'Collection
     */
    public function getDetails()
    {
        return $this->details;
    }
}

二等舱

<?php

namespace AppBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
/**
 * Class MagazineStockTakingDetails
 * @package AppBundle'Entity
 * @ORM'Entity()
 * @ORM'Table(name="sla_stocktakingdetails")
 */
class MagazineStockTakingDetails
{
    /**
     * @ORM'Id()
     * @ORM'Column(name="stackTakingDetailsId", type="integer", nullable=false)
     * @ORM'GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM'Column(name="hardwareCount", type="integer", nullable=false)
     */
    protected $count = 1;

    /////////////////////////////////////////////
    // RELACJE
    /////////////////////////////////////////////
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'MagazineStockTaking", inversedBy="details")
     * @ORM'JoinColumn(name="stacktaking_id", referencedColumnName="stockTakingId", nullable=false)
     */
    protected $stocktaking;
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'Hardware", inversedBy="stocktakingdetails",cascade={"persist"})
     * @ORM'JoinColumn(name="hardware_id", referencedColumnName="hardwareId", nullable=false)
     */
    protected $hardware;
    /////////////////////////////////////////////
    // GET SET
    /////////////////////////////////////////////

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set count
     *
     * @param integer $count
     * @return MagazineStockTakingDetails
     */
    public function setCount($count)
    {
        $this->count = $count;
        return $this;
    }
    /**
     * Get count
     *
     * @return integer 
     */
    public function getCount()
    {
        return $this->count;
    }
    /**
     * Set stocktaking
     *
     * @param 'AppBundle'Entity'MagazineStockTaking $stocktaking
     * @return MagazineStockTakingDetails
     */
    public function setStocktaking('AppBundle'Entity'MagazineStockTaking $stocktaking)
    {
        $this->stocktaking = $stocktaking;
        return $this;
    }
    /**
     * Get stocktaking
     *
     * @return 'AppBundle'Entity'MagazineStockTaking 
     */
    public function getStocktaking()
    {
        return $this->stocktaking;
    }

    /**
     * Set hardware
     *
     * @param 'AppBundle'Entity'Hardware $hardware
     * @return MagazineStockTakingDetails
     */
    public function setHardware('AppBundle'Entity'Hardware $hardware)
    {
        $this->hardware = $hardware;
        return $this;
    }
    /**
     * Get hardware
     *
     * @return 'AppBundle'Entity'Hardware 
     */
    public function getHardware()
    {
        return $this->hardware;
    }
}

三等舱

<?php

namespace AppBundle'Entity;
use Doctrine'Common'Collections'ArrayCollection;
use Doctrine'ORM'Mapping as ORM;
use JMS'Serializer'Annotation as JMS;
use JMS'Serializer'Annotation'Groups;

/**
 * Class Hardware
 * @package AppBundle'Entity
 * @ORM'Entity(repositoryClass="HardwareRepository", )
 * @ORM'Table(name="sla_hardwares")
 * @JMS'ExclusionPolicy("all")
 */
class Hardware
{
    /**
     * @ORM'Id()
     * @ORM'Column(name="hardwareId", type="integer", nullable=false)
     * @ORM'GeneratedValue(strategy="AUTO")
    */
    protected $id;
    /**
     * @ORM'Column(name="hardwareSn", type="string", length=200, nullable=true)
     */
    protected $sn;
    /**
     * @ORM'Column(name="hardwareGwarantyDate", type="datetime", nullable=true)
     */
    protected $gwarantydate;
    /**
     * @ORM'Column(name="hardwareNote", type="string", length=750, nullable=true)
     */
    protected $note;
    /**
     * @ORM'Column(name="hardwareIsReturned", type="boolean", nullable=false)
     */
    protected $isreturned = false;
    ////////////////////////////////////////
    //// RELACJE
    ////////////////////////////////////////
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'HardwareProducent", inversedBy="hardware")
     * @ORM'JoinColumn(name="producent_id", referencedColumnName="producentId", nullable=false)
    */
    protected $producent;
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'HardwareCategory", inversedBy="hardware")
     * @ORM'JoinColumn(name="category_id", referencedColumnName="hardwareCategoryId", nullable=false)
     */
    protected $category;
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'HardwareModel", inversedBy="hardware")
     * @ORM'JoinColumn(name="model_id", referencedColumnName="hardwareModelId", nullable=false)
     */
    protected $model;
    /**
     * @ORM'ManyToOne(targetEntity="AppBundle'Entity'HardwareStatus", inversedBy="hardware")
     * @ORM'JoinColumn(name="status_id", referencedColumnName="statusId", nullable=false)
     */
    protected $status;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'HardwareStatusHistory", mappedBy="hardware")
     */
    protected $statushistory;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'MagazineDetails", mappedBy="hardware")
     */
    protected $magazine;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'MagazineShiftDetails", mappedBy="hardware")
     */
    protected $magazineshift;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'MagazineUtilizeDetails", mappedBy="hardware")
     */
    protected $utilize;
    /**
     * @ORM'OneToMany(targetEntity="AppBundle'Entity'MagazineStockTakingDetails", mappedBy="hardware", cascade={"persist"})
     */
    protected $stocktakingdetails;
    ////////////////////////////////////////
    //// GET SET
    ////////////////////////////////////////
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->statushistory = new 'Doctrine'Common'Collections'ArrayCollection();
        $this->magazine = new 'Doctrine'Common'Collections'ArrayCollection();
        $this->magazineshift = new 'Doctrine'Common'Collections'ArrayCollection();
        $this->utilize = new 'Doctrine'Common'Collections'ArrayCollection();
        $this->stocktakingdetails = new 'Doctrine'Common'Collections'ArrayCollection();
    }
    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Set sn
     *
     * @param string $sn
     * @return Hardware
     */
    public function setSn($sn)
    {
        $this->sn = $sn;
        return $this;
    }
    /**
     * Get sn
     *
     * @return string 
     */
    public function getSn()
    {
        return $this->sn;
    }
    /**
     * Set gwarantydate
     *
     * @param 'DateTime $gwarantydate
     * @return Hardware
     */
    public function setGwarantydate($gwarantydate)
    {
        $this->gwarantydate = $gwarantydate;
        return $this;
    }
    /**
     * Get gwarantydate
     *
     * @return 'DateTime 
     */
    public function getGwarantydate()
    {
        return $this->gwarantydate;
    }
    /**
     * Set note
     *
     * @param string $note
     * @return Hardware
     */
    public function setNote($note)
    {
        $this->note = $note;
        return $this;
    }
    /**
     * Get note
     *
     * @return string 
     */
    public function getNote()
    {
        return $this->note;
    }
    /**
     * Set isreturned
     *
     * @param boolean $isreturned
     * @return Hardware
     */
    public function setIsreturned($isreturned)
    {
        $this->isreturned = $isreturned;
        return $this;
    }
    /**
     * Get isreturned
     *
     * @return boolean 
     */
    public function getIsreturned()
    {
        return $this->isreturned;
    }
    /**
     * Set producent
     *
     * @param 'AppBundle'Entity'HardwareProducent $producent
     * @return Hardware
     */
    public function setProducent('AppBundle'Entity'HardwareProducent $producent)
    {
        $this->producent = $producent;
        return $this;
    }
    /**
     * Get producent
     *
     * @return 'AppBundle'Entity'HardwareProducent 
     */
    public function getProducent()
    {
        return $this->producent;
    }
    /**
     * Set category
     *
     * @param 'AppBundle'Entity'HardwareCategory $category
     * @return Hardware
     */
    public function setCategory('AppBundle'Entity'HardwareCategory $category)
    {
        $this->category = $category;
        return $this;
    }
    /**
     * Get category
     *
     * @return 'AppBundle'Entity'HardwareCategory 
     */
    public function getCategory()
    {
        return $this->category;
    }
    /**
     * Set model
     *
     * @param 'AppBundle'Entity'HardwareModel $model
     * @return Hardware
     */
    public function setModel('AppBundle'Entity'HardwareModel $model)
    {
        $this->model = $model;
        return $this;
    }
    /**
     * Get model
     *
     * @return 'AppBundle'Entity'HardwareModel 
     */
    public function getModel()
    {
        return $this->model;
    }
    /**
     * Set status
     *
     * @param 'AppBundle'Entity'HardwareStatus $status
     * @return Hardware
     */
    public function setStatus('AppBundle'Entity'HardwareStatus $status)
    {
        $this->status = $status;
        return $this;
    }
    /**
     * Get status
     *
     * @return 'AppBundle'Entity'HardwareStatus 
     */
    public function getStatus()
    {
        return $this->status;
    }
    /**
     * Add statushistory
     *
     * @param 'AppBundle'Entity'HardwareStatusHistory $statushistory
     * @return Hardware
     */
    public function addStatushistory('AppBundle'Entity'HardwareStatusHistory $statushistory)
    {
        $this->statushistory[] = $statushistory;
        return $this;
    }
    /**
     * Remove statushistory
     *
     * @param 'AppBundle'Entity'HardwareStatusHistory $statushistory
     */
    public function removeStatushistory('AppBundle'Entity'HardwareStatusHistory $statushistory)
    {
        $this->statushistory->removeElement($statushistory);
    }
    /**
     * Get statushistory
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getStatushistory()
    {
        return $this->statushistory;
    }
    /**
     * Add magazine
     *
     * @param 'AppBundle'Entity'MagazineDetails $magazine
     * @return Hardware
     */
    public function addMagazine('AppBundle'Entity'MagazineDetails $magazine)
    {
        $this->magazine[] = $magazine;
        return $this;
    }
    /**
     * Remove magazine
     *
     * @param 'AppBundle'Entity'MagazineDetails $magazine
     */
    public function removeMagazine('AppBundle'Entity'MagazineDetails $magazine)
    {
        $this->magazine->removeElement($magazine);
    }
    /**
     * Get magazine
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getMagazine()
    {
        return $this->magazine;
    }
    /**
     * Add magazineshift
     *
     * @param 'AppBundle'Entity'MagazineShiftDetails $magazineshift
     * @return Hardware
     */
    public function addMagazineshift('AppBundle'Entity'MagazineShiftDetails $magazineshift)
    {
        $this->magazineshift[] = $magazineshift;
        return $this;
    }
    /**
     * Remove magazineshift
     *
     * @param 'AppBundle'Entity'MagazineShiftDetails $magazineshift
     */
    public function removeMagazineshift('AppBundle'Entity'MagazineShiftDetails $magazineshift)
    {
        $this->magazineshift->removeElement($magazineshift);
    }
    /**
     * Get magazineshift
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getMagazineshift()
    {
        return $this->magazineshift;
    }
    /**
     * Add utilize
     *
     * @param 'AppBundle'Entity'MagazineUtilizeDetails $utilize
     * @return Hardware
     */
    public function addUtilize('AppBundle'Entity'MagazineUtilizeDetails $utilize)
    {
        $this->utilize[] = $utilize;
        return $this;
    }
    /**
     * Remove utilize
     *
     * @param 'AppBundle'Entity'MagazineUtilizeDetails $utilize
     */
    public function removeUtilize('AppBundle'Entity'MagazineUtilizeDetails $utilize)
    {
        $this->utilize->removeElement($utilize);
    }
    /**
     * Get utilize
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getUtilize()
    {
        return $this->utilize;
    }
    /**
     * Add stocktakingdetails
     *
     * @param 'AppBundle'Entity'MagazineStockTakingDetails $stocktakingdetails
     * @return Hardware
     */
    public function addStocktakingdetail('AppBundle'Entity'MagazineStockTakingDetails $stocktakingdetails)
    {
        $this->stocktakingdetails[] = $stocktakingdetails;
        $stocktakingdetails->setHardware($this);
        return $this;
    }
    /**
     * Remove stocktakingdetails
     *
     * @param 'AppBundle'Entity'MagazineStockTakingDetails $stocktakingdetails
     */
    public function removeStocktakingdetail('AppBundle'Entity'MagazineStockTakingDetails $stocktakingdetails)
    {
        $this->stocktakingdetails->removeElement($stocktakingdetails);
    }
    /**
     * Get stocktakingdetails
     *
     * @return 'Doctrine'Common'Collections'Collection 
     */
    public function getStocktakingdetails()
    {
        return $this->stocktakingdetails;
    }
}

一年级课程

<?php

namespace AppBundle'Form'Type;

use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class StockTakingFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('stockingnote','textarea',array(
                'label' => false,
                'attr' => array(
                    'class' => 'gui-textarea',
                    'placeholder' => 'Uwagi',
                    'data-text' => 'Uwagi'
                ),
                'required' => false
            ))
            ->add('details','collection',array(
                'type' => new StockTakingDetailFormType(),
                'allow_add' => true,
                'by_reference' => false
            ))
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle'Entity'MagazineStockTaking',
            'attr' => array(
                'id' => 'form_stoking'
            )
        ));
    }
    public function getName() {
        return 'stocktaking';
    }
}

二年级班

<?php
namespace AppBundle'Form'Type;

use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class StockTakingDetailFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('count','number',array(
                'label' => false,
                'data' => '1',
                'required' => false
            ))
            ->add('hardware','collection',array(
                'type' => new HardwareFormType(),
                'allow_add' => true,
                'by_reference' => false
            ))
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
           'data_class' => 'AppBundle'Entity'MagazineStockTakingDetails'
        ));
    }
    public function getName()
    {
        return 'stocktakingtetail';
    }
}

三年级班

namespace AppBundle'Form'Type;

use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolver;
class HardwareFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('sn','text',array(
                'label' => false,
                'attr' => array(
                    'class' => 'gui-input',
                    'placeholder' => 'Numer Seryjny Urządzenia'
                ),
                'required' => true
            ))
            ->add('gwarantydate','number',array(
                'label' => false,
                'attr' => array(
                    'class' => 'gui-input',
                    'placeholder' => 'Ilość Gwarancji (miesięcy)'
                ),
                'required' => false
            ))
            ->add('isreturned','checkbox',array(
                'label' => 'Sprzęt Rotacyjny',
                'label_attr' => array(
                    'class' => 'option-primary'
                ),
                'required' => true
            ))
            ->add('note','textarea' ,array(
                'label' => false,
                'attr' => array(
                    'class' => 'gui-textarea',
                    'placeholder' => 'Opis',
                    'data-text' => 'Opis'
                ),
                'required' => false
            ))
            ->add('producent','entity',array(
                'class' => 'AppBundle'Entity'HardwareProducent',
                'property' => 'name',
                'label' => false,
                'attr' => array(
                    'class' => 'select',
                    'placeholder' => 'Producent'
                ),
                'required' => true
            ))
            ->add('category','entity',array(
                'class' => 'AppBundle'Entity'HardwareCategory',
                'property' => 'name',
                'label' => false,
                'attr' => array(
                    'class' => 'select',
                    'placeholder' => 'Kategoria'
                ),
                'required' => true
            ))
            ->add('model','entity',array(
                'class' => 'AppBundle'Entity'HardwareModel',
                'property' => 'name',
                'label' => false,
                'attr' => array(
                    'class' => 'select',
                    'placeholder' => 'Model'
                ),
                'required' => true
            ))
            ->add('status','entity',array(
                'class' => 'AppBundle'Entity'HardwareStatus',
                'property' => 'name',
                'label' => false,
                'attr' => array(
                    'class' => 'select',
                    'placeholder' => 'Status'
                ),
                'required' => true
            ))
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle'Entity'Hardware'
        ));
    }
    public function getName()
    {
        return 'hardware';
    }
}

如果您在硬件上有ManyToOne,则该MagazineStockTakingDetails具有对 Hardware 类型的对象的引用,因此您只能设置硬件类型的一个对象,但您正在尝试设置ArrayCollection

这行不通:

->add('hardware','collection',array(
            'type' => new HardwareFormType(),
            'allow_add' => true,
            'by_reference' => false
        ))

您将需要执行以下操作:

->add('hardware', new HardwareFormType(),array(
            ...
        ))