环境:Mac OS X Lion、PHP 5.3.10、MySQL 5.X、TYPO3 4.7.1、Extbase 4.7.1、Fluid 4.7.0
几天来,我一直在为 extbase 中的一个奇怪的验证错误而苦苦挣扎。
Tx_Foo_Controller_FeUserController 包含以下两个动作:
/** * @param $feUser * @return 无效 * @dontvalidate $feUser */ 公共函数 registerAction(Tx_Foo_Domain_Model_FeUser $feUser = NULL )
和
/** * @param Tx_Foo_Domain_Model_FeUser $feUser * @param 字符串 $password2 * @return 无效 */ 公共函数 createAction(Tx_Foo_Domain_Model_FeUser $feUser ,$password2 )
两个动作的内容:
$this->view->assign('feUser', $feUser);
register.html 具有以下形式:
<f:flashMessages />
<f:form.errors>
<div class="error">
{error.message}
<f:if condition="{error.propertyName}">
<p>
<strong>{error.propertyName}</strong>:
<f:for each="{error.errors}" as="errorDetail">
{errorDetail.message}
</f:for>
</p>
</f:if>
</div>
</f:form.errors>
<f:form object="{feUser}" objectName="feUser" class="form-horizontal" id="fooRegisterForm"
controller="FeUser" action="create" noCache="1" noCacheHash="1">
<f:form.textfield type="email" property="email" value="{feUser.email}"/>
<f:form.textfield property="password" value=""/>
<f:form.textfield name="password2" value=""/>
</f:form>
createAction 中只有一些“OK”文本。
问题是:每次我向 createAction() 方法添加 @validate 注释时,我都会收到此错误:
An error occurred while trying to call Tx_Foo_Controller_FeUserController->createAction()
如果我使用自定义验证器或捆绑验证器,则没有区别。
createAction() 的示例
* @validate $password2 Tx_Extbase_Validation_Validator_IntegerValidator
整数用于引发错误。
自定义验证器类似于 Tx_Foo_Domain_Validator_FeUserValidator ,您不必添加 @validation 标记。
自定义验证器:
/**
* Validation of given Params
*
* @param Tx_Foo_Domain_Model_FeUser $feUser
* @return void
*/
public function isValid($feUser)
{
$this->addError('Passwords are not RSA strings', 1297418974 );
return false;
}
有没有return语句没关系...
我查看了 Tx_Extbase_MVC_Controller_ActionController -> callActionMethod() 和整个验证过程(通过 var_dump 和 debug_backtrace 等),以找出为什么会发生此错误以及为什么错误消息没有输出。这一切都很奇怪......所以也许有人在这里有小费:-)
如果我在我的 feUser 类的模型中添加一个@validation 标记,例如@validate notEmpty,也会发生同样的错误
通过打字稿进行 Extbase 配置
config.tx_extbase {
features.rewrittenPropertyMapper = 1
persistence{
storagePid = 5
enableAutomaticCacheClearing = 1
updateReferenceIndex = 0
classes {
Tx_Foo_Domain_Model_FeUser {
mapping {
tableName = fe_users
columns {
lockToDomain.mapOnProperty = lockToDomain
}
}
}
}
}
}
提前非常感谢。
PS:当然,我在这里问之前用谷歌搜索了很多。