Symfony表单继承:属性和方法之一都不存在

时间:2016-09-10 22:45:13

标签: symfony symfony-forms

我有一个嵌套的表单

demand
    home
       child
       godfather

demand是一个父级并嵌入了home,其中嵌入了childfather(最后两种形式位于同一级别)

DemandeType我有:

           $builder
           ->add('date', 'datetype')
           ->add('name', 'text')
           //...

           ->add('home', 'home', array(
            'mapped' => false,
            'data_class' => 'AppBundle\Entity\Home',
            'inherit_data' => true
             ))

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Demand',
    ));
}

HomeType

           $builder
           ->add('address', 'textarea')
           //...

           ->add('child', 'child', array(
            'mapped' => false,
            'data_class' => 'AppBundle\Entity\Child',
            'inherit_data' => true
             ))

           ->add('godfather', 'godfather', array(
            'mapped' => false,
            'data_class' => 'AppBundle\Entity\Godfather',
            'inherit_data' => true
             ))

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundle\Entity\Home',
    ));
}

ChildTypeGodfatherType中,我只有firstname的文本字段,lastname和正确的data_class。

但是当我提交表单(DemandType,wichh嵌入所有子表单)时,我收到了这个错误:

  

属性“地址”和方法“getAddress()”,“address()”,“isAddress()”,“hasAddress()”,“__ get()”都不存在,并且在课堂上具有公共访问权限“的appbundle \实体\需求”。

这些方法不属于Demand实体,而属于Home实体。我放了inherit_data,我错过了什么?

由于

1 个答案:

答案 0 :(得分:1)

这是因为您正在使用inherit_data。此属性使表单将整个提交的数据传递给其子节点而不是默认情况下发生的单个属性(或任何来自getter函数的属性)。

您为demandhome执行此操作,以便home表单类型接收实例Demand实体的原因。因此,我想您要从inherit_data中删除home,并使用:

->add('home', 'home', array(
    'mapped' => false,
    'data_class' => 'AppBundle\Entity\Home',
))

在这种情况下,home将从$demand->getHome()接收应该是Hone实体的数据。

我不确定你真的需要使用inherit_data,但取决于你的使用案例。通常,您不需要它,因为您具有以下实体的结构:

/** @ORM\Entity() */
class Demand {
    /** @ORM\OneToWhatever() */
    private $home;
    public function getHome() {
        return $this->home;
    }
}

/** @ORM\Entity() */
class Home {
    /** @ORM\OneToWhatever() */
    private $child;
    public function getChild() {
        return $this->child;
    }
}

/** @ORM\Entity() */
class Child { ... }

但我不知道你的数据结构到底是什么,所以很难提供帮助。

此外,您正在使用mapped => false我不确定您想要的是什么,因为它会阻止Symfony使用表单数据更新实体。

请参阅: