3

私はすでにこれこれと他のものを読みましたが、誰も私の問題を解決しませんでした.

可能な限りすべてを削除し、アドレスという 1 つのフィールドに絞り込みました。このチュートリアルに従おうとすると、新しいプロジェクトから始めて、従うとすべてうまくいきます。しかし、私の他のプロジェクトで手動で行うと、次のエラーが表示されます。 \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