3

我已经读过这个这个和其他的,但没有人解决我的问题。

我已经删除了所有可以删除的内容并缩小到一个字段:地址。当我尝试遵循本教程时,如果我遵循它,一切都会很好,从一个全新的项目开始。但是当我在其他项目中手动执行此操作时,出现此错误:“可捕获的致命错误:传递给 BN\Bundle\MyBundle\Entity\PersonTeacher::addAdresse() 的参数 1 必须是 BN\Bundle\MyBundle 的实例\Entity\Adresse,在 C:\Users\Olivier\PhpstormProjects\My\My\src\BN\Bundle\MyBundle\Entity\PersonTeacher.php 第 111 行中给出的数组。

这是堆栈跟踪: 堆栈跟踪

这是我的代码,我在其中删除了有效的属性:


我的控制器:

<?php

namespace BN\Bundle\MyBundle\Controller;

use BN\Bundle\MyBundle\Entity\PersonTeacher;
use BN\Bundle\MyBundle\Entity\Adresse;
use BN\Bundle\MyBundle\Form\Type\AdresseType;
use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class RegistrationController extends Controller
{
    public function registerTeacherAction(Request $request)
    {
        $person = new PersonTeacher();
        $form = $this->createFormBuilder($person)
            ->add('adresses', 'collection',
                array(
                    'type' => new AdresseType(),
                    'allow_add' => true,
                    'by_reference' => false,
                )
            )
        ->getForm();
        $form->handleRequest($request);
        if ($form->isValid()) {
            /**/
        }
        return $this->render('BNMyBundle:Registration:person_teacher.form.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

我的实体 PersonTeacher:

<?php

namespace BN\Bundle\MyBundle\Entity;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="person_teacher")
 * @ORM\Entity(repositoryClass="BN\Bundle\MyBundle\Repository\PersonTeacherRepository")
 * @ORM\HasLifecycleCallbacks()
 */
class PersonTeacher extends Person
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /*--------- snap ---------*/

    /**
     * @ORM\ManyToMany(
     *     targetEntity="Adresse",
     *     inversedBy="personsTeacher",
     *     cascade={"persist"}
     * )
     * @ORM\JoinTable(name="person_teacher_adresse")
     **/
    private $adresses;

    /*--------- snap ---------*/

    public function addAdresse(\BN\Bundle\MyBundle\Entity\Adresse $adresse) {
        $this->adresses[] = $adresse;
        return $this;
    }
    public function removeAdresse(\BN\Bundle\MyBundle\Entity\Adresse $adresse) {
        $this->adresses->removeElement($adresse);
    }
    public function getAdresses() {
        return $this->adresses;
    }
    /*--------- snap ---------*/
    public function __construct() {
        parent::__construct();
        $this->adresses = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

提示

注意:我已经检查了表单是否正确发送,信息格式是否正确,并且我已经使用 xdebug 进行了逐步调试,但是对于我来说(还)太复杂了,无法看到我缺少的内容。

这是'collection'类型的问题:如果我删除'by_reference' => false,那么它可以工作....只有当我不坚持它时。

如果我尝试使用此代码坚持它:

    $form->handleRequest($request);
    if ($form->isValid()) {
        $person=$form->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($person);
        $em->flush();
    }

然后我得到这个错误:

警告:spl_object_hash() 期望参数 1 是对象,数组在 (projectpath)\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php 第 1572 行中给出

为什么?

4

1 回答 1

9

我已经找到了。

问题出在我的FormType AddressType.php文件中:setDefaultOptions()缺少该功能。一切都很好,但是如果您希望学说能够将传入的字段转换为特定的类,则此功能是强制性的。

public function setDefaultOptions(
    \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
) {
    $resolver->setDefaults(array(
        'data_class' => 'MyBundle\Entity\Adresse',
    ));
}

我对我因此而失去的时间感到非常生气。你必须熟记整个 symfony 2 进程才能快速解决这类问题,否则像我一样需要 6 个小时。Symfony 2 本身就是一个完全泄漏的抽象:你想获得时间,但你没有。Symfony 应该简化你的生活,但最后,引用 Joël Spolsky 的话:

这是一个泄漏的抽象:这意味着抽象并没有真正简化我们的生活。假装抽象出某些东西的代码生成工具,例如所有抽象,泄漏,并且有效地处理泄漏的唯一方法是了解抽象如何工作以及它们正在抽象什么。

于 2013-10-30T21:21:42.390 回答