属性xxx都不存在并且在类blabla中具有公共访问权限......但是他们确实如此

时间:2015-09-03 12:55:28

标签: symfony

我希望这是一个愚蠢的问题,但我看不到它。我正在研究Symfony 2项目(版本2.7),我有这个例外:

  

属性“contract”和“addContract()”/“removeContract()”,“setContracts()”,“contracts()”,“__ set()”或“__call()”方法之一都不存在并在“AppBundle \ Entity \ User \ User”类中拥有公共访问权限

我理解异常但是addContract()存在且是公共的,所以我的User类中的属性契约也是如此。我提交表格时遇到了这个例外。 (在这种形式中,我包括合同表。问题可能在这里)

我的UserClass with contracts属性

/**
 * @var \Doctrine\Common\Collections\Collection
 */
private $contracts;

/**
 * Add contracts
 *
 * @param \AppBundle\Entity\Work\Contract $contracts
 * @return User
 */
public function addContract(Contract $contracts)
{
    $this->contracts[] = $contracts;

    return $this;
}

/**
 * Remove contracts
 *
 * @param \AppBundle\Entity\Work\Contract $contracts
 */
public function removeContract(Contract $contracts)
{
    $this->contracts->removeElement($contracts);
}

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

我的UserType表格

class UserType extends BaseType {
/**
 * Constructor
 */
public function __construct()
{
    parent::__construct('AppBundle\Entity\User\User');
}

/**
 * @param FormBuilderInterface $builder
 * @param array                $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder
        ->add('number', 'text', array(
            'label' => 'form.number',
        ))
        ->add('seniority', 'date', array(
            'label' => 'form.seniority',
            'widget' => 'single_text',
            'input'  => 'datetime',
            'format' => 'dd/MM/yyyy',
        ))
        ->add('comment', 'textarea', array(
            'label' => 'form.comment',
            'required' => false,
        ))
        ->add('contracts', new ContractType());
}

正如您所看到的,我将我的合同表单添加到我的构建器中,并且渲染效果很好。我提交时我得到了例外。

啊,我使用Yaml映射。 User和Contract之间的关系是OneToMany - ManyToOne。一个用户可以签订许多合同。

谢谢!

1 个答案:

答案 0 :(得分:1)

可能你应该像这样构建你的表单(从contracts开始是一个ArrayCollection类型):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    parent::buildForm($builder, $options);
    $builder
        ....
        ->add('contracts', 'collection', array(
            'type' => new ContractType(),
            'by_reference' => false,
            ...
        ));
}