
在typo3 extbase开发中,自定义formfinisher在处理并发提交时,若采用不当的依赖注入方式,可能导致“too few arguments”错误。本文将深入探讨这一问题,解释其根本原因,并提供基于extbase `@inject` 注解的标准化解决方案,确保在多用户同时操作下应用的稳定性和健壮性。
在TYPO3 CMS的Extbase框架中,开发自定义功能时,我们经常需要引入其他服务或仓库(Repository)。当涉及到自定义FormFinisher并处理并发请求时,一个常见的陷阱是尝试在构造函数中手动实例化依赖项,这可能导致在特定条件下出现“Too few arguments to function TYPO3\CMS\Extbase\Persistence\Repository::__construct()”的错误。
假设我们有一个自定义的FormFinisher,其构造函数中通过 GeneralUtility::makeInstance() 方法来获取 PersistenceManager 和一个自定义的 ArticleRepository 实例,代码示例如下:
namespace [NAMESPACE]\[ExtName]\Domain\Finishers;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
use [NAMESPACE]\[ExtName]\Domain\Repository\ArticleRepository;
use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher;
class ImageGalleryFinisher extends AbstractFinisher
{
/**
* @var PersistenceManager
*/
protected $persistenceManager = null;
/**
* @var ArticleRepository
*/
protected $articleRepository = null;
public function __construct()
{
parent::__construct();
$this->persistenceManager = GeneralUtility::makeInstance(PersistenceManager::class);
$this->articleRepository = GeneralUtility::makeInstance(ArticleRepository::class);
}
// ... 其他Finisher逻辑 ...
}当多个用户几乎同时(例如,间隔1-5秒)提交表单时,可能会有一个提交者遇到以下错误:
Too few arguments to function TYPO3\CMS\Extbase\Persistence\Repository::__construct(), 0 passed in .../typo3/sysext/core/Classes/Utility/GeneralUtility.php on line 3477 and exactly 1 expected
错误堆栈进一步显示,问题发生在 GeneralUtility::makeInstance() 尝试创建 ArticleRepository 实例时,而 ArticleRepository(作为Extbase Repository的子类)的构造函数期望一个 ObjectManagerInterface 参数。
// TYPO3\CMS\Extbase\Persistence\Repository.php
public function __construct(ObjectManagerInterface $objectManager)
{
$this->objectManager = $objectManager;
$this->objectType = ClassNamingUtility::translateRepositoryNameToModelName($this->getRepositoryClassName());
}这个问题的核心在于对Extbase依赖注入机制的误解和不当使用。
TYPO3 Extbase提供了一种优雅且标准化的依赖注入方式,即使用 @inject 注解。这种方式允许Extbase的 ObjectManager 自动处理依赖项的实例化和注入,无需手动在构造函数中进行 makeInstance 调用。
修改后的FormFinisher代码应如下所示:
namespace [NAMESPACE]\[ExtName]\Domain\Finishers;
use TYPO3\CMS\Extbase\Annotation as ExtbaseAnnotation; // 引入Annotation命名空间别名
use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager;
use [NAMESPACE]\[ExtName]\Domain\Repository\ArticleRepository;
use TYPO3\CMS\Form\Domain\Finishers\AbstractFinisher;
class ImageGalleryFinisher extends AbstractFinisher
{
/**
* @var PersistenceManager
* @ExtbaseAnnotation\Inject
*/
protected $persistenceManager = null;
/**
* @var ArticleRepository
* @ExtbaseAnnotation\Inject
*/
protected $articleRepository = null;
// 构造函数可以被删除,或者只保留父类构造函数的调用
public function __construct()
{
parent::__construct();
// 依赖项现在由Extbase的ObjectManager通过@inject注解自动注入
}
// ... 其他Finisher逻辑 ...
}关键改动:
当Extbase的 ObjectManager 实例化 ImageGalleryFinisher 类时,它会:
这种机制确保了所有Extbase管理的依赖项都能以正确的方式、在正确的时机被注入,包括那些需要特定构造函数参数的Repository类。它避免了手动管理依赖的复杂性和潜在错误,尤其是在并发环境中。
TYPO3 Extbase中的“Too few arguments”错误,尤其是在并发场景下暴露,通常是由于在自定义组件中不正确地手动实例化Extbase依赖项所致。通过摒弃 GeneralUtility::makeInstance() 并在属性上使用 @ExtbaseAnnotation\Inject 注解,我们可以将依赖管理委托给Extbase的 ObjectManager,从而确保依赖项被正确、安全地注入。这不仅解决了并发执行可能带来的问题,也符合Extbase框架的最佳实践,提升了代码的健壮性和可维护性。
以上就是TYPO3 FormFinisher并发执行与Extbase依赖注入的最佳实践的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号