此问题在我之前提出的关于在Cake 3.x应用程序中执行搜索时实施验证的问题中得到了解答:CakePHP 3.x search form with 11 different models
我一直在阅读Using Custom Validation Rules上的文档。
我已将以下内容添加到Model/Table/EcsTable.php
:
public function validationSearch($validator)
{
$extra = 'Some additional value needed inside the closure';
$validator->add('value', 'custom', [
'rule' => function ($value, $context) use ($extra) {
return false;
},
'message' => 'The title is not valid'
]);
return $validator;
}
这是文档中给出的内容的副本,但我添加了return false
,因为我试图测试验证方法产生错误。
在我的控制器中,我有以下内容:
$ecs_entity = TableRegistry::get('Ecs')->newEntity(
$this->request->getData(),
[
'validate' => 'search', // tells cake to use validateSearch
]
);
我无法通过此方法生成验证错误。如果我提交表单(以便提交请求数据)然后执行debug($ecs_entity);
errors
属性为空数组:
object(Cake\ORM\Entity) {
'ecs' => [
'value' => '124'
],
// ...
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Ecs'
}
这是为什么?我打算在validationSearch
内的闭包内编写逻辑,验证传递的数据。但是,我甚至无法让它产生错误,因此无法实现这一目标。我是以错误的方式实现这个吗?
根据最初的问题,我试图用正确的方式做事#Cake方式"写作验证。我已经到了这样的地步,我正在认真考虑放弃它,只是将所有内容都放在Controller中,因为传递数据非常繁琐 - 并且在我可以的时候涉及更多行代码只需在控制器中验证它。
像往常一样,任何帮助表示赞赏。
答案 0 :(得分:1)
您传递给newEntity
来电的数据格式不正确。
看起来你正在传递像
这样的东西 [
'ecs' => [
'value' => 123
]
]
应该是:
[ 'value' => 123 ]
有效 Ecs
实体的调试输出应如下所示:
object(Cake\ORM\Entity) {
'value' => '123',
'[new]' => true,
'[accessible]' => [
'*' => true
],
'[dirty]' => [
'value' => true
],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'Esc'
}
正如您所看到的,value
是对象的直接属性。
如果没有看到你的Form
我可以猜到你创造了它:
$this->Form->control( 'ecs.value')
而不是
$this->Form->control( 'value' );