TYPO3 / Extbase:Datamapper 不再与 TYPO3 9 一起工作。5.x
TYPO3 / Extbase: Datamapper not working anymore with TYPO3 9.5.x
在 TYPO3 8.7.x 等较旧的 TYPO3 版本中,我使用 DataMapper 将查询生成器 select 结果的结果映射到对象数组。这在 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);
}
一些 classes 需要其他对象作为依赖项。如果属性用 @inject
注释或有匹配的 injectPropertyName
方法,则在 TYPO3 中就是这种情况。
在这种情况下,您应该使用 ObjectManager 实例化 class(在本例中为 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;
在 TYPO3 8.7.x 等较旧的 TYPO3 版本中,我使用 DataMapper 将查询生成器 select 结果的结果映射到对象数组。这在 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);
}
一些 classes 需要其他对象作为依赖项。如果属性用 @inject
注释或有匹配的 injectPropertyName
方法,则在 TYPO3 中就是这种情况。
在这种情况下,您应该使用 ObjectManager 实例化 class(在本例中为 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;