0

TYPO3 10LTS の extbase の流動的なフォームからマッピングされたタイプ ObjectStorage のドメイン プロパティ フィールドを取得する方法を誰かが知っていますか?

ドメイン オブジェクトに次のプロパティがあります。

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

これは、fluid テンプレートの 1 つのフィールドです。

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

firstNameEmployeeドメイン オブジェクトのプロパティの 1 つです。

Employeeで満たされた 1 つのオブジェクトで満たされた ObjectStorage を取得することを期待します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 のオブジェクト マッパーは、オブジェクトの各プロパティの正しい型を見つけようとします。これを行う最初の方法は、プロパティのセッター メソッドを見つけることです。私の場合、これは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 に答える