Symfony2 表单集合句柄请求错误"Neither the property nor one of the methods exist and have public access"

Symfony2 Form collection handle request error "Neither the property nor one of the methods exist and have public access"

我想用集合处理表单时遇到问题

我有两个实体 FeatureCategory 和 Feature

用户在每个 featureCategory(featureCategories 的集合)中选择一个特征。

要素类别实体:

 class FeatureCategory
{
    /**
     * @var \Doctrine\Common\Collections\Collection
     * @ORM\OneToMany(targetEntity="Site\BackendBundle\Entity\Feature", mappedBy="featureCategory", cascade={"persist"})
     */
    private $features;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->features = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add feature
     *
     * @param \Site\BackendBundle\Entity\Feature $feature
     * @return FeatureCategory
     */
    public function addFeature(\Site\BackendBundle\Entity\Feature $feature)
    {

        $feature->setFeatureCategory($this);
        $this->features[] = $feature;

        return $this;
    }

    /**
     * Remove feature
     *
     * @param \Site\BackendBundle\Entity\Feature $feature
     */
    public function removeFeature(\Site\BackendBundle\Entity\Feature $feature)
    {
        $this->features->removeElement($feature);
    }

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

和特征实体:

class Feature
{
    /**
     * @var \Site\BackendBundle\Entity\FeatureCategory
     *
     * @ORM\ManyToOne(targetEntity="Site\BackendBundle\Entity\FeatureCategory", inversedBy="features")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="feature_category_id", referencedColumnName="id")
     * })
     */
    private $featureCategory;

    /**
     * Set featureCategory
     *
     * @param \Site\BackendBundle\Entity\FeatureCategory $featureCategory
     * @return Feature
     */
    public function setFeatureCategory(\Site\BackendBundle\Entity\FeatureCategory $featureCategory = null)
    {
        $this->featureCategory = $featureCategory;

        return $this;
    }

    /**
     * Get featureCategory
     *
     * @return \Site\BackendBundle\Entity\FeatureCategory
     */
    public function getFeatureCategory()
    {
        return $this->featureCategory;
    }
}

特征类别形式:

class FeatureCategoriesFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('featureCategories', 'collection', array(
                'type' => 'site_frontend_feature_category',
                'by_reference' => false
            ))
            ->add('quantity', 'text', array(
                'data' => 1
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('feature_categories')
        ));
    }

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

和特征类别形式:

class FeatureCategoryFormType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($builder)
        {
            $form = $event->getForm();
            $data = $event->getData();

            /* Check we're looking at the right data/form */
            if ($data instanceof FeatureCategory)
            {
                $choices = $data->getFeatures();
                $form
                    ->add('features', 'entity', array(
                        'multiple'  => false,
                        'expanded'  => true,
                        'class' => 'SiteBackendBundle:Feature',
                        'property' => 'value',
                        'choices' => $choices,
                        'data' => null
                    ))
                    ->add('name', 'hidden', array(
                        'read_only' => true,
                        'label' => $data->getName()
                    ))
                ;
            }
        });

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Site\BackendBundle\Entity\FeatureCategory',
            'validation_groups' => array('feature_category')
        ));
    }

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

最后是我的控制器:

class OrderController extends Controller
{
    public function addProductAction(Request $request, $slug)
    {
        $em = $this->get('doctrine.orm.default_entity_manager');

        $item = $em->getRepository('SiteBackendBundle:Product')
            ->getItem($slug);

        if (!$item) {
            throw new NotFoundHttpException();
        }

        $featureCategories = $em->getRepository('SiteBackendBundle:FeatureCategory')
            ->getListByProduct($item);

        $featureCategoriesForm = $this->createForm('site_frontend_feature_categories', array('featureCategories' => $featureCategories),
            array(
                'method' => 'POST',
                'action' => $this->generateUrl('user_order_add_product', array(
                    'slug' => $item->getSlug(),
                ))
            )
        );

        if ($request->isXmlHttpRequest()) {
            if ($request->isMethod('POST')) {
                $featureCategoriesForm->handleRequest($request);

                if ($featureCategoriesForm->isValid()) {
                    //order add product logic
                }
            }
        }
    }
}

$featureCategoriesForm->handleRequest($request); 行之后,我得到一个错误

Neither the property "features" nor one of the methods "addFeatur()"/"removeFeatur()", "addFeature()"/"removeFeature()", "setFeatures()", "features()", "__set()" or "__call()" exist and have public access in class "Site\BackendBundle\Entity\FeatureCategory".

抱歉这么久post 有人可以帮忙吗?

最终,我解决了将实体作为数组使用 choice 类型形式的问题,没有 data_class 等等