Symfony2 – методы Doctrine ArrayCollection возвращаются как неопределенные

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

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: Ошибка: вызов неопределенного метода Acme\MyBundle\Entity\Thing::current() в /home/kevin/www/project/vendor/acme/my-bundle/Acme/MyBundle/Entity/MyEntity.php, строка 106

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

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

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


person Major Productions    schedule 11.06.2013    source источник
comment
У вас есть метод add в вашем классе Thing?   -  person bpoiss    schedule 11.06.2013
comment
Можете ли вы var_dump() объект перед вызовом getThing()?   -  person cheesemacfly    schedule 11.06.2013
comment
Нет. Опять же, похоже, что он «забывает», что things в этот момент должен быть коллекцией.   -  person Major Productions    schedule 11.06.2013
comment
@cheesemacfly, я понятия не имею, как это сделать в данном случае. Сущность используется для заполнения представления формы, поэтому вызов скрыт под несколькими слоями материала для генерации форм Symfony2.   -  person Major Productions    schedule 11.06.2013
comment
Если поставить var_dump(), он появится вверху экрана.   -  person cheesemacfly    schedule 11.06.2013


Ответы (2)


Странный. Я смог обойти это, проверив его базовый тип:

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

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

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

person Major Productions    schedule 11.06.2013
comment
@ I3I0 верен, возможно, просто отсутствуют скобки после ArrayCollection; вот так: $this-›things = new ArrayCollection(); - person Dung; 29.03.2016

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

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

иначе вы получили null вместо ArrayCollection для новых сущностей

person l3l0    schedule 11.06.2013
comment
Я сделал это в ответ, который с тех пор удалил другой человек. Проблема осталась даже после этого. - person Major Productions; 11.06.2013