我已经删除了所有可以删除的内容并缩小到一个字段:地址。当我尝试遵循本教程时,如果我遵循它,一切都会很好,从一个全新的项目开始。但是当我在其他项目中手动执行此操作时,出现此错误:“可捕获的致命错误:传递给 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 行中给出
为什么?