验证参数,通过 $this->request->setArgument() 设置

Validate parameters, set by $this->request->setArgument()

我有一个控制器操作,它接受 3 个参数:第一个是从流体形式构建的,另外 2 个是在 initialize*() 操作中创建并提供给请求的。

protected function initializeCombinedAction()
{
    // creation of ObjectStorage's $firstList and $secondList
    $this->request->setArgument('firstList', $firstList);
    $this->request->setArgument('secondList', $secondList);
}

/**
 *
 * @param \Vendor\Ext\Domain\Model\MyModel $mymodel
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Ext\Domain\Model\SubModel>    $firstList
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Ext\Domain\Model\SubModel>    $secondList
 */
public function combinedAction(Model\MyModel $mymodel, $firstList, $secondList)
{
// some code here
}

$firstList$secondList 创建为数组,就好像它们是在请求中提供的一样。 PropertyMapper 识别它们并正确映射,导致两个 ObjectStorageSubModel 持有实例可用作操作参数。

但问题是,没有对 SubModel 进行验证。 执行第一个参数验证器,但不执行第二个和第三个参数。

我是否应该以某种方式明确定义此类验证?

问题应该是 ObjectStorage 没有默认验证器。您始终可以像这样自己设置验证:

 * @validate $firstList \Vendor\Ext\Domain\Validator\ListValidator

感谢 Dimitri L.,我被指出了正确的方向。

答案是:Extbase 验证所有操作参数,无论它们是如何构造的,但它不会自动解析 ObjectStorage 类型参数的验证器。

幸运的是,已经有内置的 CollectionValidator,可以完全用于此目的。

所以,我的初始动作签名将如下所示:

/**
 * @param \Vendor\Ext\Domain\Model\MyModel $mymodel
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Ext\Domain\Model\SubModel>    $firstList
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\Vendor\Ext\Domain\Model\SubModel>    $secondList
 * @validate $firstList Collection(elementType=\Vendor\Ext\Domain\Model\SubModel)
 * @validate $secondList Collection(elementType=\Vendor\Ext\Domain\Model\SubModel)
 */
public function combinedAction(Model\MyModel $mymodel, $firstList, $secondList)
{
// some code here
}

此外,我在 TYPO3 Forge 上创建了一个问题:#78546