当'返回false时,CakePHP 3.x没有给出验证错误。供给

时间:2018-05-03 10:52:20

标签: cakephp cakephp-3.0

此问题在我之前提出的关于在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中,因为传递数据非常繁琐 - 并且在我可以的时候涉及更多行代码只需在控制器中验证它。

像往常一样,任何帮助表示赞赏。

1 个答案:

答案 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' );