【问题标题】:How to use entities in collection (+prototype) in Symfony 2.1如何在 Symfony 2.1 中使用集合中的实体(+原型)
【发布时间】:2012-07-09 23:43:29
【问题描述】:

我想在 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。

VerifFormType.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>

【问题讨论】:

    标签: php doctrine symfony-2.1


    【解决方案1】:

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

    VerifFormType 中存在类似问题:sitterDegrees 字段映射到您的 Sitter 类中的 setterDegrees 属性。但是,这个类没有这样的属性。

    【讨论】:

    • 谢谢,但是 VerifFormType 不好?然而,在 Sitter 类中有一个 sitterDegrees 属性。但我看不到如何修复 DegreesFormType,有什么线索/例子吗?
    • 好的,我只需要名称而不是 DegreesFormType 中的 sitterDegrees。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 2016-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多