Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.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
Forms Symfony2表单集合句柄请求错误“;该属性或其中一种方法均不存在且不具有公共访问权限”;_Forms_Symfony_Collections_Relationship_One To Many - Fatal编程技术网

Forms Symfony2表单集合句柄请求错误“;该属性或其中一种方法均不存在且不具有公共访问权限”;

Forms Symfony2表单集合句柄请求错误“;该属性或其中一种方法均不存在且不具有公共访问权限”;,forms,symfony,collections,relationship,one-to-many,Forms,Symfony,Collections,Relationship,One To Many,当我想用托收处理表单时,我遇到了一个问题 我有两个实体FeatureCategory和Feature 用户在每个featureCategory(featureCategories集合)中选择一个功能 要素类别实体: class FeatureCategory { /** * @var \Doctrine\Common\Collections\Collection * @ORM\OneToMany(targetEntity="Site\BackendBundle\En

当我想用托收处理表单时,我遇到了一个问题

我有两个实体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)之后行,我出错了

属性“features”或其中一个方法 “addFeature()”/“removeFeature()”、“addFeature()”/“removeFeature()”, “setFeatures()”、“features()”、“_set()”或“_call()”存在并具有 类“Site\BackendBundle\Entity\FeatureCategory”中的公共访问

很抱歉发了这么长的邮件
有人能帮忙吗?

最终,我修复了使用实体作为数组的问题,该数组具有
选项
类型表单,没有
数据类
等等

缺少FeatureCategory::setFeatures(),在我使用的表单中由\u reference=>false,因此,对于设置数据,应使用添加/删除方法,而不是设置功能您尚未在
FeatureCategoriesFormType
中设置
allow\u add
allow\u delete
。如果查看,您将看到这些选项的默认值为
false
。这可能是原因?关于允许添加和允许删除,您是对的,但我根本不使用这些选项。例如,在表单I中有功能类别“颜色”和功能“白色”、“灰色”、“黄色”等,用户选择其中一个,他不能添加新功能或删除旧功能,只能从列表中选择您使用的框架版本?关于2.7上类似的东西,还有一个公开的问题