簡體   English   中英

Symfony 2嵌入式表單:可捕獲的致命錯誤:傳遞給Entity的參數1 :: addProperty必須是XX \\ MyClass的一個實例,給出的數組

[英]Symfony 2 Embedded Forms: Catchable Fatal Error: Argument 1 passed to Entity::addProperty must be an instance of XX\MyClass, array given

我已經讀過和其他的人,但沒有一個解決我的問題。

我已經刪除了所有可能的內容並縮小到一個字段:地址。 當我嘗試按照本教程學習時 ,如果我遵循它,從一個全新的項目開始,一切正常。 但是當我在我的其他項目中手動完成時,我收到此錯誤:“可捕獲的致命錯誤:傳遞給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行中給出的數組。

繼承人堆棧跟蹤: stacktracke

這是我的代碼,我刪除了有效的屬性:


我的控制器:

<?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行中給出的數組

為什么?

我找到了。

問題出在我的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ëlSpolsky:

這是一個漏洞的抽象:它意味着抽象並沒有像他們想要的那樣真正簡化我們的生活。 代碼生成工具假裝抽象出一些東西,比如所有抽象,泄漏,以及處理泄漏的唯一方法是學習抽象如何工作以及抽象的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM