私はすでにこれとこれと他のものを読みましたが、誰も私の問題を解決しませんでした.
可能な限りすべてを削除し、アドレスという 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 で指定されたオブジェクト、配列であると想定します
なんで?