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'}"/>
firstName
是 Employee
域对象的一个 属性。
我希望得到一个 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 中工作得很好。
有人知道如何从 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'}"/>
firstName
是 Employee
域对象的一个 属性。
我希望得到一个 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 中工作得很好。