TYPO3 / Extbase: Datamapper больше не работает с TYPO3 9.5.x

В более старых версиях TYPO3, таких как TYPO3 8.7.x, я использовал DataMapper для сопоставления результатов выбора моего конструктора запросов с массивом объектов. Это нормально работает в TYPO3 8.7.x, но в TYPO3 9.5.x у меня появляется сообщение об ошибке Вызов функции-члена buildDataMap () при нулевом значении.

//MyRepository.php

namespace Vendor\MyExtension\Domain\Repository;

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\Mapper\DataMapper;

/**
 * @param string $search
 *
 * @return array
 */
public function findBySearch($search)
{
    $querybuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('tx_myextension_domain_model_produkt');
    $records = $querybuilder->select('tx_myextension_domain_model_produkt.*')
        ->from('tx_myextension_domain_model_produkt')
        ->orWhere(
            $querybuilder->expr()->like('titel', $querybuilder->createNamedParameter('%' . $search . '%')),
            $querybuilder->expr()->like('untertitel', $querybuilder->createNamedParameter('%' . $search . '%'))
        )
        ->orderBy('titel')
        ->execute()
        ->fetchAll();

    $dataMapper = GeneralUtility::makeInstance(DataMapper::class);
    return $dataMapper->map($this->objectType, $records);
}

person Ralf    schedule 04.06.2019    source источник


Ответы (2)


Некоторым классам требуются другие объекты в качестве зависимостей. Так обстоит дело в TYPO3, если свойства аннотированы с помощью @inject или если существует соответствующий injectPropertyName метод.

В этом случае вы должны создать экземпляр класса (в данном случае DataMapper) с помощью ObjectManager.

Обычно это выглядит так:

$dataMapper = GeneralUtiity::makeInstance(ObjectManager::class)->get(DataMapper::class);
person Nitori    schedule 04.06.2019
comment
Я не вижу ваш класс, но если вы расширяете YourClass extends \TYPO3\CMS\Extbase\Persistence\Repository, тогда ObjectManager уже доступен, и вы можете использовать его с $this->objectManager->get(DataMapper::class). - person bandanh; 04.06.2019
comment
Правда, я забыл об этом. То же самое, если он находится внутри контроллера extbase. - person Nitori; 04.06.2019

Поскольку метод get в ObjectManager отмечен как устаревший в TYPO3 версии 10, я использую аннотацию inject для получения экземпляра DataMapper.

    /**
     * Datamaper
     *
     * @var DataMapper
     * @TYPO3\CMS\Extbase\Annotation\Inject
     */
    protected $dataMapper;
person fazzyx    schedule 07.01.2021