首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TYPO3 v10.4.21自定义FormFinisher:同时执行导致异常

TYPO3 v10.4.21自定义FormFinisher:同时执行导致异常
EN

Stack Overflow用户
提问于 2021-11-23 10:54:34
回答 1查看 107关注 0票数 0

我们使用以下构造函数创建了一个自定义表单finisher:

代码语言:javascript
复制
/**
* @var \TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager $persistenceManager
*/
protected $persistenceManager = null;

/**
* @var \[NAMESPACE]\[ExtName]\Domain\Repository\ArticleRepository $articleRepository
*/
protected $articleRepository = null;

public function __construct() {
    parent::__construct();
    $this->persistenceManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class);
    $this->articleRepository = GeneralUtility::makeInstance(\[NAMESPACE]\[ExtName]\Domain\Repository\ArticleRepository::class);
}

当表单几乎同时执行(延迟1-5秒测试)时,表单提交者中的一个将得到错误:

对于函数TYPO3\CMS\Extbase\Persistence\Repository::__construct(),0来说,

参数太少,在第3477行的path_to_docroot/httpdocs/typo3/sysext/core/Classes/Utility/GeneralUtility.php中传递,并且正好是预期的1

当它试图创建ArticleRepository的实例时,就会发生这种情况:

1:

TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('NAMESPACE[ExtName]\Domain\Repository\ArticleRepository')在path_to_docroot/httpdocs/typo3conf/ext/ext_name/Classes/Domain/Finishers/ImageGalleryFinisher.php第31行的

代码语言:javascript
复制
28  public function __construct() {
29      parent::__construct();
30      $this->persistenceManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager::class);
31      $this->articleRepository = GeneralUtility::makeInstance(\[NAMESPACE]\[ExtName]\Domain\Repository\ArticleRepository::class);
32  }

2:

TYPO3\CMS\Extbase\Persistence\Repository->__construct()在path_to_docroot/httpdocs/typo3/sysext/core/Classes/Utility/GeneralUtility.php 3477行的

代码语言:javascript
复制
3473         return self::$container->get($className);
3474     }
3475 
3476     // Create new instance and call constructor with parameters
3477     $instance = new $finalClassName(...$constructorArguments);
3478     // Register new singleton instance, but only if it is not a known PSR-11 container service
3479     if ($instance instanceof SingletonInterface && !(self::$container !== null && self::$container->has($className))) {
3480         self::$singletonInstances[$finalClassName] = $instance;
3481     }

3(发生错误时):

path_to_docroot/httpdocs/typo3/sysext/extbase/Classes/Persistence/Repository.php第71行中的

代码语言:javascript
复制
67   * Constructs a new Repository
68   *
69   * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager
70   */
71  public function __construct(ObjectManagerInterface $objectManager) 
72  {
73      $this->objectManager = $objectManager;
74      $this->objectType = ClassNamingUtility::translateRepositoryNameToModelName($this->getRepositoryClassName());
75  }

另一个提交是没有问题地执行的。我们已经在一个分期环境中测试过这个。我的同事不能通过同时执行两个表单来在本地重新创建相同的错误(尽管他的执行速度可能比暂存环境更快)。

我重申,问题是同时执行终结者。但是为什么呢?这能防止吗?是否有可能将ObjectManagerInterface中继到此构造函数?

或者有人能看到另一个缺陷?或者这是核心的某个地方的错误?

我什么都找不到..。任何帮助或指示都将不胜感激,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-23 15:01:52

在尝试了许多不同的事情之后,我终于找到了解决方案。

使用inject注释的

代码语言:javascript
复制
/**
* @var PersistenceManager $persistenceManager
* @\TYPO3\CMS\Extbase\Annotation\Inject
*/
protected $persistenceManager = null;

/**
* @var ArticleRepository $articleRepository
* @\TYPO3\CMS\Extbase\Annotation\Inject
*/
protected $articleRepository = null;

然后可以删除构造函数,它可以同时执行。干杯!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70079597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档