Вызов неопределенного метода getPosition () - Почему и как исправить

Я сделал расширение extbase с классом Appointment со свойством expertises и другим subExpertises того же типа.
Вот как они выглядят в классе Appointment (subExpertises то же самое):

    /**
     * expertises
     *
     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<...\Domain\Model\Expertise>
     */
    protected $expertises = NULL;

    /**
     * Adds an expertise
     *
     * @param ...\Domain\Model\Expertise $expertise
     * @return void
     */
    public function addExpertise(...\Domain\Model\Expertise $expertise) {
        $this->expertises->attach($expertise);
    }

Я получаю сообщение об ошибке при выполнении этого кода в моем контроллере после редактирования встречи в жидкой форме:

/**
 *
 * @param \Domain\Model\Appointment $appointment
 * @return void
 */
public function bookAction(\Domain\Model\Appointment $appointment) {

    //empty all expertises of appointment - then fill them with the selected from lawyer
    $appointment->setExpertises(new \TYPO3\CMS\Extbase\Persistence\ObjectStorage());
    $appointment->setSubExpertises(new \TYPO3\CMS\Extbase\Persistence\ObjectStorage());

    //add all checked expertises of lawyer to appointment
    foreach ($appointment->getLawyer()->getExpertises() as $expertise) {
        if ($expertise->getChecked()) {
            $appointment->addExpertise($expertise);
        }
        foreach ($expertise->getSubExpertises() as $subExpertise) {
            if ($subExpertise->getChecked()) {
                $appointment->addSubExpertise($subExpertise);
            }
        }
    }
    $this->appointmentRepository->update($appointment);
}

Это ошибка:

Неустранимая ошибка: вызов неопределенного метода \ Domain \ Model \ Expertise :: getPosition () в /var/www/typo3_src/typo3_src-6.2.25/typo3/sysext/extbase/Classes/Persistence/Generic/Backend.php в строке 453

Теперь кажется, что TYPO3 думает, что Expertise относится к типу ObjectStorage, потому что он пытается вызвать getPosition(), но я не знаю, почему он это делает, и что мне следует изменить, чтобы успешно сохранить мой Appointment объект с новым Expertises.

Я попытался отладить объект встречи, но не смог найти проблему - мне это кажется нормальным, он просто показывает, что expertises и subExpertises были изменены.


person Cold_Class    schedule 05.12.2016    source источник
comment
... у вас разные варианты написания экспертизы, единственное число в свойстве, множественное число в методе.   -  person j4k3    schedule 06.12.2016
comment
Я снова проверил свой текст, но все было в порядке - реквизиты являются objectStorage, поэтому множественное число expertises и subExpertises имя класса Expertise, а addExpertise только добавляет один, поэтому оно должно быть в единственном числе   -  person Cold_Class    schedule 06.12.2016


Ответы (1)


Методы получения в Extbase не волшебны, их нужно явно определять.

Если вы имеете дело с отношением n: n, вам также необходимо инициализировать свойство как ObjectStorage в вашей модели и настроить его в TCA.

/**
 * Initialize all ObjectStorage properties.
 *
 * @return void
 */
protected function initStorageObjects() {
    $this->yourProperty = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
}
person j4k3    schedule 06.12.2016
comment
Спасибо, вы наставили меня на правильный путь - заметив, что subExpertise не был инициализирован как хранилище объектов - я проследил причину: это было потому, что я установил отношение в моем конструкторе расширений на 1:n вместо m:n - person Cold_Class; 06.12.2016