0

有人知道如何从 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 

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

4

1 回答 1

0

好的,这个问题的答案很简单。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 @param 表示法。这会导致问题中提到的错误,因为参数类型将ObjectStorage没有子类型。

所以总结使用public function setCompanyEmployees($companyEmployees)和@param 表示法中的 FQN 和映射在 Typo3 10LTS 中确实工作得很好。

于 2020-07-29T18:32:15.840 回答