验证参数,通过 $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
识别它们并正确映射,导致两个 ObjectStorage
的 SubModel
持有实例可用作操作参数。
但问题是,没有对 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。
我有一个控制器操作,它接受 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
识别它们并正确映射,导致两个 ObjectStorage
的 SubModel
持有实例可用作操作参数。
但问题是,没有对 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。