在Symfony whith集合中嵌入表单时出错

时间:2015-11-26 10:48:17

标签: forms symfony

我有2个“简单”实体,我想做classical form embedding
但我有这个错误:“属性”itemcode“和方法”getItemcode()“,”itemcode()“,”isItemcode()“,”hasItemcode()“,”__ get()“都不存在“NWA \ ItemSelectorBundle \ Entity \ ItemSelector”类中的公共访问。“

我看过很多有这个错误的帖子,但都没有提供解决方案

在我有getItemCode()的实体中,为什么它会公开? 我的建筑有什么问题?

提前谢谢

这是我的实体(与故障属性相关的部分)

class ItemSelector
{
    /**
     * @var Items[]
     *
     * @ORM\OneToMany(targetEntity="NWA\ItemSelectorBundle\Entity\Item", mappedBy="itemselector", cascade={"all"})
     */
    protected $items;

    /**
     * Class constructor
     */
    public function __construct()
    {
        $this->items = new ArrayCollection();
    }

    /**
     * Add item
     *
     * @param \NWA\ItemSelectorBundle\Entity\Item $item
     *
     * @return ItemSelector
     */
    public function addItem(\NWA\ItemSelectorBundle\Entity\Item $item)
    {
        $this->items[] = $item;
        //$item->setItemselector($this);
        return $this;
    }

    /**
     * Remove item
     *
     * @param \NWA\ItemSelectorBundle\Entity\Item $item
     */
    public function removeItem(\NWA\ItemSelectorBundle\Entity\Item $item)
    {
        $this->items->removeElement($item);
    }

    /**
     * Get items
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getItems()
    {
        return $this->items;
    }
}

class Item
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="itemcode", type="string", length=255)
     */
    protected $itemcode;


    /**
     * @var ItemSelector
     *
     * @ORM\ManyToOne(targetEntity="NWA\ItemSelectorBundle\Entity\ItemSelector", inversedBy="items")
     * @ORM\JoinColumn(name="itemselector_id", referencedColumnName="id")
     */
    protected $itemselector;

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

    /**
     * Set itemcode
     *
     * @param string $itemcode
     *
     * @return Item
     */
    public function setItemcode($itemcode)
    {
        $this->itemcode = $itemcode;

        return $this;
    }

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

    /**
     * Set itemselector
     *
     * @param \NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector
     *
     * @return Item
     */
    public function setItemselector(\NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector = null)
    {
        $this->itemselector = $itemselector;

        return $this;
    }

    /**
     * Get itemselector
     *
     * @return \NWA\ItemSelectorBundle\Entity\ItemSelector
     */
    public function getItemselector()
    {
        return $this->itemselector;
    }
}

然后是Form构造函数

class ItemSelectorType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

            ->add(
                'itemcode', 'collection', array(
                    'type'          => new ItemType(),
                    'prototype'     => true,
                    'allow_add'     => true,
                    'allow_delete'  => true
                )
            );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'NWA\ItemSelectorBundle\Entity\ItemSelector',
            'translation_domain' => 'resource'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'nwa_itemselector';
    }
}

class ItemType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'itemcode', 'text', array(
                    'label' => 'Code'
                )
            );
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'NWA\ItemSelectorBundle\Entity\Item'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'nwa_itemselectorbundle_item';
    }
}

最后在Controller中调用

public function chooseAction(Request $request, ItemSelector $itemSelector)
{
    $form = $this->get('form.factory')
        ->create(new ItemSelectorType(), $itemSelector);

    $form->handleRequest($request);
    if ($form->isValid()) {

    }

    return array(
        '_resource' => $itemSelector,
        'form'      => $form->createView(),
    );
}

1 个答案:

答案 0 :(得分:2)

您可能需要将字段名称itemcode重命名为ItemSelectorType中的项目。

        ->add(
            'items', 'collection', array(
                'type'          => new ItemType(),
                'prototype'     => true,
                'allow_add'     => true,
                'allow_delete'  => true
            )
        );
相关问题