Typo3 Extbase:存储库中的PersistanceManager为NULL

Typo3 Extbase:存储库中的PersistanceManager为NULL,typo3,extbase,typo3-8.x,typo3-extensions,Typo3,Extbase,Typo3 8.x,Typo3 Extensions,我正在为TYPO3 8构建一个扩展,可能我对注入机制了解不够,但我的情况如下: 我已经编写了一个服务类来查询API。 该服务还从本地存储库获取一些信息: class服务{ 受保护的$myRepository 公共函数构造(){ $objectManager=GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\objectManager'); $this->myRepository=GeneralUtility::makeInstance(

我正在为TYPO3 8构建一个扩展,可能我对注入机制了解不够,但我的情况如下:

我已经编写了一个服务类来查询API。
该服务还从本地存储库获取一些信息:

class服务{
受保护的$myRepository
公共函数构造(){
$objectManager=GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\objectManager');
$this->myRepository=GeneralUtility::makeInstance(myRepository::class,$objectManager);
var_dump($this->myRepository->persistanceManager);#输出空值
}
公共函数调用者函数(){
var_dump($this->myRepository->persistenceManager);#输出空值
myRepository->someRepositoryFunction();
}
}
这将调用
myRepository->someRepositoryFunction()

类MyRepository扩展\TYPO3\CMS\Extbase\Persistence\Repository{
公共函数someRepositoryFunction(){
var_dump($this->persistenceManager)#输出有效的单例persistenceManager
$data=$this->findAll();#成功
}
}
此代码在前端控制器中使用时有效

类MyController扩展\TYPO3\CMS\Extbase\Mvc\Controller\ActionController{
/**
*@var MyRepository
*@注入
*/
受保护的$myRepository=null;
公共职能清单行动(){
myRepository->someRepositoryFunction();
}
}
第一个
var\u dump
以某种方式输出
NULL
,而第二个
var\u dump
神奇地输出一个有效的单例。
print\r
-似乎未调用
存储库::\u construct()
存储库::injectPersistenceManager()
中的语句。因此,我无法解释PersistenceManager突然从何而来

简化的堆栈跟踪:

#0 MyExtension\Domain\Repository\MyRepository->someRepositoryFunction()在[MyExtension/Classes/Service/ApiService.php]调用
#在[MyExtension/Classes/Domain/Repository/AnotherRepository.php]调用1 MyExtension\Service\ApiService->callerFunction()
#2在[MyExtension/Classes/Controller/MyController.php]调用MyExtension\Domain\Repository\AnotherRepository->someOtherRepositoryFunction()
#3 MyExtension\Controller\MyController->listAction()
既然代码有效,那就不是什么大问题了。 但是,如果我从任务类调用相同的代码,PersistenceManager将保持
NULL

类MyTask扩展了AbstractTask
{
受保护的$apiService=null;
公共函数execute()
{
$this->apiService=GeneralUtility::makeInstance(apiService::class);
$data=$this->apiService->callerFunction();
返回true;
}
}
同样,简化的Stacktrace:

#0 MyExtension\Domain\Repository\MyRepository->someRepositoryFunction()在[MyExtension/Classes/Service/ApiService.php]调用
#1在[MyExtension/Classes/Task/MyTask.php]调用MyExtension\Service\ApiService->callerFunction()
#在[typo3/sysext/scheduler/Classes/scheduler.php]调用2 MyExtension\Task\MyTask->execute()
#3在[TYPO3/sysext/Scheduler/Classes/Controller/SchedulerModuleController.php]调用的TYPO3\CMS\Scheduler\Scheduler->executeTask()
现在,由于MyRepository的PersistenceManager是
null
,因此会在null上抛出对成员函数createQueryForType()的
调用

请注意,在这两种情况下,MyRepository都是由ApiService实例化的! 那么,如果我从控制器或任务调用它,会有什么区别呢?
ApiService::\u构造
在这两种情况下都被调用。(尽管
MyRepository
的实例在此时仍然为空。)

为什么PersistenceManager会突然出现?

而不是:

$objectManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->myRepository = GeneralUtility::makeInstance(MyRepository::class, $objectManager);
试试这个:

$objectManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->myRepository = $objectManager->get(MyRepository::class);
objectManager解析所有依赖项注入。

而不是:

$objectManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->myRepository = GeneralUtility::makeInstance(MyRepository::class, $objectManager);
试试这个:

$objectManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->myRepository = $objectManager->get(MyRepository::class);

objectManager解析所有依赖项注入。

当我在
MyRepository::\u construct
中手动实例化PersistenceManager时,错误发生得晚了一点。在这种情况下,PM本身没有注入
QueryFactory
。当我在
MyRepository::\u construct
中手动实例化PersistenceManager时,错误发生得晚了一点。在这种情况下,PM本身不会被注入
QueryFactory