Typo3 / Extbase: Datamapper больше не работает с Typo3 9.5.x - PullRequest
0 голосов
/ 04 июня 2019

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

//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);
}

1 Ответ

2 голосов
/ 04 июня 2019

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

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

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

$dataMapper = GeneralUtiity::makeInstance(ObjectManager::class)->get(DataMapper::class);
...