CakePHP 3.x 在提供 'return false' 时未给出验证错误
CakePHP 3.x not giving validation error when 'return false' supplied
这个问题在某种程度上延续了我之前询问的关于在 Cake 3.x 应用程序中执行搜索时实施验证的问题:
我一直在阅读 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 way" 编写验证。我已经到了认真考虑放弃它的地步,只是将所有内容都放在控制器中,因为传递数据非常乏味 - 并且当我可以在控制器中验证它时涉及更多代码行.
您传递给 newEntity
调用的数据格式无效。
看起来你正在传递类似
的东西
[
'ecs' => [
'value' => 123
]
]
什么时候应该是:
[ 'value' => 123 ]
debug valid 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' );
这个问题在某种程度上延续了我之前询问的关于在 Cake 3.x 应用程序中执行搜索时实施验证的问题:
我一直在阅读 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 way" 编写验证。我已经到了认真考虑放弃它的地步,只是将所有内容都放在控制器中,因为传递数据非常乏味 - 并且当我可以在控制器中验证它时涉及更多代码行.
您传递给 newEntity
调用的数据格式无效。
看起来你正在传递类似
的东西 [
'ecs' => [
'value' => 123
]
]
什么时候应该是:
[ 'value' => 123 ]
debug valid 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' );