Validation CakePHP 3属于遗传验证

Validation CakePHP 3属于遗传验证,validation,cakephp,model,has-and-belongs-to-many,cakephp-3.0,Validation,Cakephp,Model,Has And Belongs To Many,Cakephp 3.0,我一直在为如何验证自己的人际关系而挣扎。即,经典配方/成分关系。我想一个食谱总是有一个成分的创建或编辑。我的验证在我的Recipes表中是什么样子的?我试过: $validator->requirePresence('ingredients')->notEmpty('ingredients') 以及 $validator->requirePresence('ingredients._ids')->notEmpty('ingredients._ids') 第二种方法的工

我一直在为如何验证自己的人际关系而挣扎。即,经典配方/成分关系。我想一个食谱总是有一个成分的创建或编辑。我的验证在我的Recipes表中是什么样子的?我试过:

$validator->requirePresence('ingredients')->notEmpty('ingredients')
以及

$validator->requirePresence('ingredients._ids')->notEmpty('ingredients._ids')
第二种方法的工作原理是,我的表单不进行验证,但它不会将
error
类添加到输入中。我正在使用
成分的字段名设置输入。\u id

为了在测试中成功添加记录,我在创建要传递到测试中的
$this->post
的数据时也遇到了问题。我测试中的数据如下所示:

$data = [
    'ingredients' => [
        '_ids' => [
             '2'
        ]
    ];
当然,我是用
$this->post('/recipes/add',$data)在测试中发布帖子的


我在测试中没有通过成分的规定。

我解决了如何设置验证器的问题。在配方表验证程序中:

$validator->add('ingredients', 'custom', [
    'rule' => function($value, $context) {
        return (!empty($value['_ids']) && is_array($value['_ids']));
    },
    'message' => 'Please choose at least one ingredient'
]);
但是,表单上没有显示验证消息,因此我正在执行
isFieldError
检查:

        <?php if ($this->Form->isFieldError('ingredients')): ?>
            <?php echo $this->Form->error('ingredients'); ?>
        <?php endif; ?>

我在视图文件中使用了多个复选框,而不是多选

这样,我就可以在表格上得到我的验证信息


正如我所想,一旦我找到了验证器,我的测试就到位了。我在上面展示的内容对于通过测试数据来说确实是正确的。

我希望添加这个答案作为对克里斯答案的评论,但我没有足够的声誉

或者,要解决表单上未显示验证消息的问题,可以在控制器中添加这两行

if(empty($this->request->data['ingredients']['_ids']))
    $yourentity->errors('ingredients', 'Please choose at least one ingredient');

“我没有通过规定的规则……”到底是什么意思?是否存在任何验证错误?如果是这样的话,它们是否与您以前的验证问题有关,或者这是一个不同的问题?我可能应该将其分为两个问题。您是否能够验证应如何在表对象中设置验证规则,以便在创建或更新配方记录时要求配料?如果我能解决这个问题,我的测试可能会自然而然地到位。你已经找到了答案,这确实是必须做到的。我想等待答案,直到我知道这是否会被合并:它最终合并了,当遵循命名约定时(
components.\u id
用于字段名,
components
用于实体属性名),您的输入字段现在应该能够自动拾取错误。感谢您对pull请求的引用,我很高兴它被合并。除了显示验证消息之外,这还会考虑将错误类添加到元素中吗?是的,它会像处理所有其他字段一样工作,包装器会获取
错误
类,使用Cake3/4 AfterMarshall事件,您实际上可以通过使用
if($entity->getError('components')&&&!$entity->getError('components.\u id')){$entity->setError('components.\u id'),$entity->getError('components');