TYPO3如何实现string[]到Object[]的类型转换器?
解决TYPO3 10.4中字符串数组转User对象数组的类型转换器问题
1. 正确编写UserArrayConverter类
继承Extbase的AbstractTypeConverter,明确源类型、目标类型和优先级(必须高于默认数组转换器的优先级1),并实现数组转换逻辑:
<?php namespace Your\Extension\Property\TypeConverter; use TYPO3\CMS\Extbase\Property\TypeConverter\AbstractTypeConverter; use Your\Extension\Domain\Model\User; use TYPO3\CMS\Extbase\Property\PropertyMappingConfigurationInterface; use TYPO3\CMS\Extbase\Property\PropertyMapper; class UserArrayConverter extends AbstractTypeConverter { protected $sourceTypes = ['array']; // 目标类型匹配模型中users属性的类型,这里以数组为例 protected $targetType = 'array<' . User::class . '>'; // 优先级高于默认转换器,确保被优先调用 protected $priority = 10; /** * @var PropertyMapper */ protected $propertyMapper; public function injectPropertyMapper(PropertyMapper $propertyMapper) { $this->propertyMapper = $propertyMapper; } /** * @param array $source 提交的字符串数组 * @param string $targetType * @param array $convertedChildProperties * @param PropertyMappingConfigurationInterface|null $configuration * @return User[] */ public function convertFrom($source, $targetType, array $convertedChildProperties = [], PropertyMappingConfigurationInterface $configuration = null) { $userObjects = []; foreach ($source as $userIdentifier) { // 复用已有的单个User转换器完成转换 $user = $this->propertyMapper->convert($userIdentifier, User::class); if ($user instanceof User) { $userObjects[] = $user; } } return $userObjects; } }
2. 注册类型转换器
在扩展的ext_localconf.php中注册自定义转换器:
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['property']['typeConverters'][16789001] = \Your\Extension\Property\TypeConverter\UserArrayConverter::class;
注:方括号内的数字需为唯一值,避免与其他扩展冲突。
3. 配置属性映射(关键步骤)
在控制器的初始化动作中,为report对象的users属性指定使用自定义转换器:
protected function initializeYourAction() { $propertyMappingConfig = $this->arguments['report']->getPropertyMappingConfiguration(); $propertyMappingConfig->forProperty('users') ->setTypeConverter(\Your\Extension\Property\TypeConverter\UserArrayConverter::class); }
4. 确保表单参数格式正确
Fluid表单中需以数组格式提交users参数:
<f:form.textfield name="report[users][]" value="user_1_id" /> <f:form.textfield name="report[users][]" value="user_2_id" />
常见排查点
- 优先级:必须设置高于默认数组转换器(默认优先级为1),否则Extbase会优先调用内置转换器
- 目标类型:需与模型中
users属性的类型严格匹配,若属性为ObjectStorage<User>,则目标类型改为\TYPO3\CMS\Extbase\Persistence\ObjectStorage<' . User::class . '>,并在convertFrom中返回ObjectStorage实例 - 参数格式:确保提交的
users是数组而非字符串,否则不会触发数组类型转换器
内容的提问来源于stack exchange,提问作者Desmes
相关产品推荐
相关产品推荐

