You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:55:33