«Класс не существует. Отражение не удалось».с отложенной загрузкой и хранением объектов - PullRequest
1 голос
/ 15 мая 2019

Я обновляю веб-сайт с TYPO3 8 до TYPO3 9

Весь код работал хорошо с TYPO3 8.
Теперь я должен адаптироваться, как это было с еще более ранним TYPO3 (TCA, доктрина, ...), и выдает некоторые ошибки.

На данный момент у меня проблема с некоторыми страницами, я получаю только эту ошибку (в небольших модификациях):

(1/2) # 1278450972 TYPO3 \ CMS \ Extbase \ Reflection \ Exception \ UnknownClassException

Класс VendorName \ VendorExtensionName \ Domain \ Model \ TYPO3 \ CMS \ Extbase \ Persistence \ ObjectStorage не существует. Отражение не удалось.

Я предполагаю, что это вызвано этим кодом:

<?php
namespace VendorName\VendorExtensionName\Controller;
use TYPO3\CMS\Extbase\Annotation\Inject;

class AnsprechpartnerController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {

    /**
     * ansprechpartnerRepository
     *
     * @Inject
     * @var \VendorName\VendorExtensionName\Domain\Repository\AnsprechpartnerRepository
     */
    protected $ansprechpartnerRepository;

    [...]

    /**
     * action showDetail
     *
     * @return void
     */
    public function showDetailAction() {
        $pids = $this->settings['pids'];
        $this->settings['ansprechpartner'] = explode(',', $this->settings['ansprechpartner']);
        foreach ($this->settings['ansprechpartner'] as $uid) {
            $person = $this->ansprechpartnerRepository->findByUid($uid);  

    [...]

так как эта последняя строка находится в стеке отладки.

Расширение имеет 8 видов записей, которые связаны друг с другом. Я предполагаю, что из-за этого определяются отношения lazy и используются хранилища объектов.

<?php
namespace VendorName\VendorExtensionName\Domain\Model;
use TYPO3\CMS\Extbase\Annotation\ORM\Lazy;
/**
 *
 * @package vendor_extension_name
 *
 */
class Ansprechpartner extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity {

[...]


/**
 * Organisationseinheit
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VendorName\VendorExtensionName\Domain\Model\Organisation>
 * @Lazy
 */
protected $organisationseinheit;

/**
 * Dienstleistungen
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\VendorName\VendorExtensionName\Domain\Model\AnsprechpartnerDienstleistung>
 * @Lazy
 */
protected $dienstleistungen = NULL;

[...]

Но здесь порядок смешанных классов меняется на противоположный.
Тем не менее это может быть причиной смешивания / объединения существующих пространств имен VendorName\VendorExtensionName\Domain\Model [\Ansprechpartner] и
\TYPO3\CMS\Extbase\Persistence\ObjectStorage на странное имя класса
VendorName\VendorExtensionName\Domain\Model\TYPO3\CMS\Extbase\Persistence\ObjectStorage, который, конечно, не существует.


Edit:
вставить использование
use TYPO3\CMS\Extbase\Annotation\Inject; и
use TYPO3\CMS\Extbase\Annotation\ORM\Lazy; вместо встроенных inject и lazy, что не имеет никакого эффекта.


Редактировать 2:

Инициализация хранилищ (пример из класса выше):

class Ansprechpartner extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
{

    :
    /**
     * __construct
     *
     * @return Ansprechpartner
     */
    public function __construct() {
        $this->initStorageObjects();
    }

    /**
     * Initializes all ObjectStorage properties.
     *
     * @return void
     */
    protected function initStorageObjects() {
        $this->organisationseinheit = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
        $this->dienstleistungen = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
    }
    :

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Мы выяснили, что это связано с изменениями в 9.x того, что относительные пространства имен теперь поддерживаются в аннотациях и TypeHints.

До версии 9.x Extbase Reflection всегда принимал абсолютные пространства имен.

Если есть метод с этой подписью, который работал до 9.x (что является ошибкой) и больше не работает с 9.x:

public function setSomeStorage(TYPO3\CMS\Extbase\Persistence\ObjectStorage $storage) {

Это должно быть:

public function setSomeStorage(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $storage) {
1 голос
/ 15 мая 2019

В версии 9.0 аннотация @lazy была заменена на @TYPO3\CMS\Extbase\Annotation\ORM\Lazy.

Может быть, это может помочь: https://docs.typo3.org/typo3cms/extensions/core/latest/Changelog/9.0/Feature-83078-ReplaceLazyWithTYPO3CMSExtbaseAnnotationORMLazy.html

...