2013-06-11 3 views
0

Это странно. У меня есть объект, который может содержать ArrayCollection других связанных объектов. Когда я делаю пару вспомогательных методов, чтобы позволить мне добавлять/извлекать значение сингулярного объекта, я получаю исключение Symfony2, указывающее, что метод не определен. Я включаю пространство имен, поэтому я не понимаю, в чем проблема. Код (имена немного изменились из-за NDA) ниже:Symfony2 - Doctrine ArrayCollection методы возвращаются как undefined

namespace Acme\MyBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\ArrayCollection; 

// ... 

public function setThing($thing) 
{ 
    $this->things->add($thing); 
} 

public function getThing() 
{ 
    return $this->things->current(); 
} 

Что действительно странно, что он бросает исключение в current() но не add():

FatalErrorException: Error: Call to undefined method Acme\MyBundle\Entity\Thing::current() in /home/kevin/www/project/vendor/acme/my-bundle/Acme/MyBundle/Entity/MyEntity.php line 106

Судя по ошибке, это выглядит, как это не обрабатывая things как ArrayCollection. Есть ли способ заставить things быть ArrayCollection? У меня уже есть следующее:

/** 
* @var ArrayCollection things 
* 
* @ORM\OneToMany(targetEntity="Thing", mappedBy="other") 
*/ 
private $things; 

Но я не уверен, что еще делать.

+0

У вас есть метод 'add' в вашем' Thing' классе? – bpoiss

+0

Можете ли вы 'var_dump()' объект перед вызовом 'getThing()'? – cheesemacfly

+0

№ Опять же, похоже, что «забыть», что «вещи» должны быть коллекцией в этот момент. –

ответ

0

Нечетные. Я был в состоянии работать вокруг него, проверяя его базовый тип:

public function getThing() 
{ 
    if (get_type($this->things) === 'ArrayCollection') { 
     return $this->things->current(); 
    } else { 
     return $this->things; 
    } 
} 

форма теперь кажется, правильно, без каких-либо исключений.

Может быть, он ленивый - назначает ArrayCollection, если существует более одного связанного объекта, и оставляет его как только связанный объект, если есть только один? : Пожимают плечами:

+0

@ I3I0 верен, возможно, просто будут отсутствовать круглые скобки после ArrayCollection; например: $ this-> things = new ArrayCollection(); – Dung

0

Вы должны инициализировать ArrayCollection в конструкторе объекта:

public function __construct() 
{ 
    $this->things = new ArrayCollection; 
} 

иначе вы получили null вместо ArrayCollection для новых объектов

+0

Я сделал это в ответе, чем другой человек с тех пор удалил. Проблема осталась даже после этого. –

Смежные вопросы