TYPO3:如何从 extbase 中的流体形式映射 ObjectStorage<SomeSubType> 类型的域 属性 字段?

TYPO3: How to get a domain property field with type ObjectStorage<SomeSubType> mapped from a fluid form in extbase?

有人知道如何从 TYPO3 10LTS 上的 extbase 中的流体形式获取类型为 ObjectStorage 的域 属性 字段吗?

我在域对象中有以下 属性:

    /**
     * @var ObjectStorage<Employee>|null
     */
    protected ?ObjectStorage $companyEmployees = null;

这是流体模板的一个字段:

<f:form.textfield property="companyEmployees.0.firstName" id="companyEmployees.0.firstName" additionalAttributes="{required: 'required'}"/>

firstNameEmployee 域对象的一个​​ 属性。

我希望得到一个 ObjectStorage,里面装满了一个 Employee 对象,里面装满了 firstName。但我收到以下异常:

Core: Exception handler (WEB): Uncaught TYPO3 Exception: Return value of TYPO3\CMS\Extbase\Property\TypeConverter\ObjectStorageConverter::getTypeOfChildProperty() must be of the type string, null returned 

关于如何正确执行此操作的任何想法?

好的,这个问题的答案很简单。 extbase 的对象映射器确实会尝试为对象的每个 属性 找出正确的类型。第一种方法是尝试找到 属性 的 setter 方法。在我的例子中,这将是 setCompanyEmployees.

而这个必须按以下方式构建:

    /**
     * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\MyVendor\Ext\Domain\Model\Employee> $companyEmployees
     */
    public function setCompanyEmployees($companyEmployees): void
    {
        $this->companyEmployees = $companyEmployees;
    }

重要的是要注意您在PHPdoc @param 表示法中使用 FQN。在 extbase 的其他部分,自 10LTS 以来不再需要使用 FQN,但在这里它是!

其次,重要的是要注意您必须省略参数的类型。所以在我的例子中,我有 public function setCompanyEmployees(ObjectStorage $companyEmployees) 这不起作用,因为你不能在 PHP 中有子类型(没有像 ObjectStorage<Employee> 这样的东西)并且 extbase 更喜欢参数类型而不是 phpdoc @参数表示法。这导致了问题中提到的错误,因为参数类型将是 ObjectStorage 没有子类型。

所以总而言之,在@param 符号中使用 public function setCompanyEmployees($companyEmployees) 和 FQN,映射在 Typo3 10LTS 中工作得很好。