Я строю расширение для TYPO3 8 и, возможно, я недостаточно хорошо понимаю механизмы внедрения, но вот моя ситуация:
Я написал класс обслуживания для запроса API.
Указанная служба также получает некоторую информацию из локального репозитория:
class ApiService {
protected $myRepository
public function __construct() {
$objectManager = GeneralUtility::makeInstance('TYPO3\CMS\Extbase\Object\ObjectManager');
$this->myRepository = GeneralUtility::makeInstance(MyRepository::class, $objectManager);
var_dump($this->myRepository->persistanceManager); # outputs NULL
}
public function callerFunction() {
var_dump($this->myRepository->persistenceManager); # outputs NULL
myRepository->someRepositoryFunction();
}
}
Это вызывает myRepository->someRepositoryFunction()
:
class MyRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
public function someRepositoryFunction() {
var_dump($this->persistenceManager); # outputs a valid singleton PersistenceManager
$data = $this->findAll(); # succeeds
}
}
Этот код работает при использовании в внешнем контроллере .
class MyController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {
/**
* @var MyRepository
* @inject
*/
protected $myRepository = null;
public function listAction() {
myRepository->someRepositoryFunction();
}
}
Каким-то образом первый var_dump
выводит NULL
, в то время как второй var_dump
магически выводит действительный синглтон.
print_r
-статизмы в Repository::__construct()
и Repository::injectPersistenceManager()
кажется, не называется.Поэтому я не могу объяснить, откуда вдруг появился PersistenceManager.
Упрощенная трассировка стека:
#0 MyExtension\Domain\Repository\MyRepository->someRepositoryFunction() called at [myExtension/Classes/Service/ApiService.php]
#1 MyExtension\Service\ApiService->callerFunction() called at [myExtension/Classes/Domain/Repository/AnotherRepository.php]
#2 MyExtension\Domain\Repository\AnotherRepository->someOtherRepositoryFunction() called at [myExtension/Classes/Controller/MyController.php]
#3 MyExtension\Controller\MyController->listAction()
Поскольку коды работают, это не будет большой проблемой.Но если я вызываю тот же код из класса Task , PersistenceManager остается NULL
.
class MyTask extends AbstractTask
{
protected $apiService = null;
public function execute()
{
$this->apiService = GeneralUtility::makeInstance(ApiService::class);
$data = $this->apiService->callerFunction();
return true;
}
}
Снова упрощенная Stacktrace:
#0 MyExtension\Domain\Repository\MyRepository->someRepositoryFunction() called at [myExtension/Classes/Service/ApiService.php]
#1 MyExtension\Service\ApiService->callerFunction() called at [myExtension/Classes/Task/MyTask.php]
#2 MyExtension\Task\MyTask->execute() called at [typo3/sysext/scheduler/Classes/Scheduler.php]
#3 TYPO3\CMS\Scheduler\Scheduler->executeTask() called at [typo3/sysext/scheduler/Classes/Controller/SchedulerModuleController.php]
Теперь выдается Call to a member function createQueryForType() on null
, потому что PersistenceManager для MyRepository равен NULL
.
Обратите внимание, что MyRepository создается в обоих случаях ApiService!Так какая разница, если я позвоню из контроллера или задачи?ApiService::__construct
вызывается в обоих случаях.(Хотя экземпляры MyRepository
в этот момент все еще равны NULL.)
Почему PersistenceManager появляется внезапно?