2013-02-17 7 views
5

mam problem z zapisem podmioty z powrotem do mnie ten błąd:Symfony2 __toString() Błąd

Catchable Fatal Error: Method My\BusinessBundle\Entity\Type::__toString() 
must return a string value in 
/var/www/MyBusiness0_1/vendor/doctrine/orm/lib/Doctrine/ORM/ORMInvalidArgumentException.php line 113 

Najdziwniejsze jest to, że metoda __ toString() jest rodzajem jednostki!

class Type 
{ 
//.. 

/** 
* @var string 
* 
* @ORM\Column(name="type", type="string", length=100) 
*/ 
private $type; 

/** 
* @ORM\OneToMany(targetEntity="MailTelCont", mappedBy="type") 
*/ 
protected $mailTelContacts; 

public function __construct() 
{ 
    $this->mailTelContacts = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

public function __toString() 
{ 
    return $this->getType(); 
} 
//... 

Kolejną dziwną rzeczą jest to, że jeśli mogę umieścić kaskadę = { „utrzymywać”} class MailTelCont na ManyToOne związku „typu” nie pokazuje mi ten błąd, ale zapisać nowe pole w typ ..

Klasa MailTelCont

class MailTelCont 
{ 
//.. 
/** 
* @var string 
* 
* @ORM\Column(name="contact", type="string", length=100) 
*/ 
private $contact; 

/** 
* @ORM\ManyToOne(targetEntity="Type", inversedBy="mailTelContacts") 
* @ORM\JoinColumn(name="type_id", referencedColumnName="id") 
*/ 
private $type; 

/** 
* @ORM\ManyToOne(targetEntity="Anagrafica", inversedBy="mailTelContacts", cascade={"persist"}) 
* @ORM\JoinColumn(name="anagrafica_id", referencedColumnName="id") 
* @Assert\Type(type="My\BusinessBundle\Entity\Anagrafica") 
*/ 
private $anagrafica; 

public function __toString() 
{ 
    return $this->getContact(); 
} 

połączeń forma zagnieżdżonego "AnagraficType" w ten sposób:

class TypeType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('type', 'entity', array(
       'class' => 'My\BusinessBundle\Entity\Type', 
       'attr' => array('class' => 'conct'), 
       'property' => 'type', 
       'label' => 'Tipologia', 
     )) 
    ; 
} 
***** 
class MailTelContType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('type', new TypeType()) 
     ->add('contact', 'text', array('label' => 'Contatto'))     
    ; 
} 
***** 
class AnagraficaType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('mailTelContacts', 'collection', array('type' => new MailTelContType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false 
      )) 

Gdzie robię źle?

Odpowiedz

13

Myślę, że te wartości są wtedy null. Próbowałaś:

public function __toString() 
{ 
    return (string) $this->getType(); 
} 

i

public function __toString() 
{ 
    return (string) $this->getContact(); 
} 

W ten sposób, gdy wartość jest null będą rzutować na ciąg i nie należy się tego wyjątku.

+0

Dziękuję za odpowiedź, ale teraz zwrócić ten błąd: 'Nowa jednostka została znaleziona przez związek„My \ BusinessBundle \ Entity \ MailTelCont # typ”, który nie został skonfigurowany do kaskady utrzymują operacje jednostki: telefono. Aby rozwiązać ten problem: Albo jawnie wywołaj EntityManager # persist() na tej nieznanej encji, albo skonfiguruj kaskadę, utrzymuj to skojarzenie w odwzorowaniu na przykład @ManyToOne (.., cascade = {"persist"}) ' jeśli wstawię 'cascade = {"persist"} "jednak zapisz nowe pole w typie, nie musisz, ponieważ typ jest tylko kontenerem wyborów typów kontaktu (np. e-mail, faks, telefon ..) – Lughino

+0

to działa dla mnie, dzięki ;) –