我在TYPO3中开发了一个Scheduler任务,它基本上在访问每个类库时生成文件。如果在BE中删除了与另一个类的记录具有依赖关系的某个记录,我希望该任务也从存储库中删除该相应的记录。为此我想到了使用存储库方法。
这里我定义了存储库(还有更多,但这两个与我的问题相关):
/** @var CustomerRepository $apprep */
$apprep = $objectManager->get(\Cjk\Icingaconfgen\Domain\Repository\HostRepository::class);
/** @var Typo3QuerySettings $querySettings */
$querySettings = $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$querySettings->setRespectStoragePage(FALSE);
$apprep->setDefaultQuerySettings($querySettings);
$hosts = $apprep->findAll();
/** @var CustomerRepository $apprep2 */
$apprep2 = $objectManager->get(\Cjk\Icingaconfgen\Domain\Repository\ServicesRepository::class);
/** @var Typo3QuerySettings $querySettings */
$querySettings = $objectManager->get('TYPO3\\CMS\\Extbase\\Persistence\\Generic\\Typo3QuerySettings');
$querySettings->setRespectStoragePage(FALSE);
$apprep2->setDefaultQuerySettings($querySettings);
$services = $apprep2->findAll();
$srvrep = $apprep2;
在我的代码中,我有以下块:
foreach($services as $service){
$validate2 = false;
foreach($hosts as $host){
if($host->getUid() == $service->getHost()){
$validate2 = true;
break;
}
}
if($validate2 == false){
foreach($kunden as $kunde){
$name = $kunde->getName();
$files = array_filter(scandir('/etc/icinga2/conf.d/hosts/'.$name.'/'), function($item) {
return !is_dir('/etc/icinga2/conf.d/hosts/'.$name.'/'. $item);
});
foreach($files as $fileval){
if($fileval == 'Service_' . $service->getServicename(). '_'. $kunde->getKundennummer().'.conf'){
unlink('/etc/icinga2/conf.d/hosts/'.$kunde->getName().'/'.$fileval);
}
}
}
$srvrep->remove($service);
}
}
正如您所看到的,我检查相应的服务是否有任何主机(如果存在依赖关系,$ service对象的getter getHost()基本上返回特定对应主机对象(getUid())的Uid。如果没有依赖项,它首先删除文件,然后我希望它从存储库中删除该记录。但行
$srvrep->remove($service);
似乎不能像我想要的那样工作。
答案 0 :(得分:2)
在Extbase ActionController
之外的任何上下文中使用Extbase持久层时,您需要手动刷新PersistenceManager
以保留更改。
$persistenceManager = $objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class);
$persistenceManager->persistAll();