0

我想在我得到的 Symfony 2.1.0-dev 错误中添加一组实体:

Neither property "sitterDegrees" nor method "getSitterDegrees()" nor method "isSitterDegrees()" exists in class "xxx\Entity\Degrees"

发生这种情况是因为我在 DegreesFormType.php 中有一个实体,并且 $this->form->bindRequest($request);在我的处理程序的这一行。我想在“sitter”实体上添加多个“度数”(但度数不是像http://symfony.com/doc/master/cookbook/form/form_collections.html那样的选择)我忘了什么吗?

实体

Sitter 和 Degrees 之间的简单多对多

保姆

class Sitter
{
    //some properties
    /**
     * @var xxx\Entity\Degrees
     * @ORM\ManyToMany(targetEntity="xxx\Entity\Degrees", orphanRemoval=true, inversedBy="sitters",cascade={"persist"})
     * @ORM\JoinTable(name="sitter_degrees_relationships",
     *   joinColumns={
     *     @ORM\JoinColumn(name="sitter_id", referencedColumnName="id")
     *   },
     *   inverseJoinColumns={
     *     @ORM\JoinColumn(name="degrees_id", referencedColumnName="id")
     *   }
     * )
     */
    private $sitterDegrees;

    public function getSitterDegrees()
    {
        return $this->sitterDegrees;
    }

    public function setSitterDegrees(ArrayCollection $sitterDegrees)
    {
        foreach ($sitterDegrees as $sitterDegree) {
            $sitterDegree->addSitter($this);
        }

        $this->sitterDegrees = $sitterDegrees;
    }

    public function addSitterDegree(xxx\Entity\Degrees $sitterDegrees)
    {
        $this->sitterDegrees[] = $sitterDegrees;

        return $this;
    }

    public function removeSitterDegree(xxx\Entity\Degrees $sitterDegrees)
    {
        $this->sitterDegrees->removeElement($sitterDegrees);
    }
}

度数

class Degrees
{
    public function __toString(){return $this->name;}

    private $id;

    private $name;

    /**
     * @var xxx\Entity\Sitter
     * @ORM\ManyToMany(targetEntity="xxx\Entity\Sitter", mappedBy="sitterDegrees")
     */
    private $sitters;

    public function __construct()
    {
        $this->sitters = new \Doctrine\Common\Collections\ArrayCollection();
    }

    public function getId()
    {
        return $this->id;
    }

    public function setName($name)
    {
        $this->name = $name;
    }

    public function getName()
    {
        return $this->name;
    }

    public function getSitters()
    {
        return $this->sitters;
    }

    public function addSitter(xxx\Entity\Sitter $sitter)
    {
        if (!$this->sitters->contains($sitter)) {
            $this->sitters->add($sitter);
        }
    }

    public function removeSitter(xxx\Entity\Sitter $sitters)
    {
        $this->sitters->removeElement($sitters);
    }
}

表单类型

VerifFormType.php 是我的主要表单,它嵌入了 DegreesFormType。

验证表单类型.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        //->add('some_properties')
        ->add('sitterDegrees', 'collection', array(
                            'type' => new DegreesFormType(),
                            'by_reference' => false,
                            'allow_add' => true,
                            'allow_delete' => true,
            )
        );
}

DegreesFormType.php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('sitterDegrees', 'entity', array(
            'class' => 'xxx:Degrees'
        ));

}

控制器

public function indexAction()
{
    $user = $this->get('security.context')->getToken()->getUser();
    $sitter = $user->sitter;

    $formHandler = $this->get('xxx.form.handler');
    $form = $formHandler->getForm();
    $form->setData($sitter);

    if ($formHandler->process()) {
        //ok
    }

    //fail

}

处理程序

public function process()
{
    $request = $this->container->get('request');
    if ('POST' == $request->getMethod()) {
        $this->form->bindRequest($request);//Fail at this line

        if ($this->form->isValid()) {
            return $this->onSuccess();
        }
    }
    return false;
}

public function onSuccess()
{
    $sitter = $this->form->getData();
    $this->form->bindRequest($this->container->get('request'));
    $sitter->setContainer($this->container);
    $this->container->get('xxx.manager')->persistSitter($sitter);

    return true;
}

index.html.twig

使用食谱中的一些javascript http://symfony.com/doc/master/cookbook/form/form_collections.html

<ul class="degrees" data-prototype="{{ form_widget(form.sitterDegrees.getVar('prototype')) | e }}">
  {% for sitterDegree in form.sitterDegrees %}
     <li>{{ form_row(sitterDegree) }}</li>
  {% endfor %}
</ul>
4

1 回答 1

1

错误来自 DegreesFormType:该sitterDegrees字段映射到setterDegrees您的Degrees类中的属性。但是,这个类没有这样的属性。

有一个类似的问题VerifFormType:该sitterDegrees字段映射到setterDegreesSitter类中的属性。但是,这个类没有这样的属性。

于 2012-07-10T15:58:34.853 回答