Extbase: PersistanceManager в репозитории имеет значение NULL - PullRequest
0 голосов
/ 08 февраля 2019

Я строю расширение для 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 появляется внезапно?

1 Ответ

0 голосов
/ 08 февраля 2019

Вместо:

$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 разрешает все инъекции зависимостей.

...