簡體   English   中英

TYPO3 / Extbase:數據映射器不再適用於 TYPO3 9.5.x

[英]TYPO3 / Extbase: Datamapper not working anymore with TYPO3 9.5.x

在 TYPO3 8.7.x 等較舊的 TYPO3 版本中,我使用 DataMapper 將查詢生成器選擇結果的結果映射到對象數組。 這在 TYPO3 8.7.x 中工作正常,但在 TYPO3 9.5.x 中,我收到錯誤消息“ Call to a member function buildDataMap() on 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);
}

某些類需要其他對象作為依賴項。 如果屬性用@inject注釋或者有匹配的injectPropertyName方法,則在TYPO3 中就是這種情況。

在這種情況下,您應該使用 ObjectManager 實例化類(在本例中為 DataMapper)。

這通常看起來像這樣:

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

由於 ObjectManager 的get方法在 TYPO3 版本 10 中被標記為已棄用,因此我使用inject注釋來獲取 DataMapper 實例

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM