Validation 在CakePHP中设置运行时验证规则

Validation 在CakePHP中设置运行时验证规则,validation,cakephp,Validation,Cakephp,我现在的问题是模型有一组验证规则,如下所示: var $validate = array( 'title' => array( 'rule' => 'notEmpty' ), 'uri' => array( 'slugged' => array( 'rule' => '/^[a-z0-9-_]+$/i', 'message' => 'This field s

我现在的问题是模型有一组验证规则,如下所示:

var $validate = array(
    'title' => array(
        'rule' => 'notEmpty'
    ),
    'uri' => array(
        'slugged' => array(
            'rule' => '/^[a-z0-9-_]+$/i',
            'message' => 'This field should only contain characters, numbers, dashes and underscores'
        ),
        'uniqueUrl' => array(
            'rule' => array('uniqueUrl'),
            'message' => 'A page has already acquired this url'
        )
    ),
    'meta_keywords' => array(
        'rule' => 'notEmpty'
    ),
    'meta_description' => array(
        'rule' => 'notEmpty'
    ),
    'layout' => array(
        'rule' => 'notEmpty'
    )
);
问题是,在另一个只有一个关系的模型中,其控制器也将数据插入其中。我不想要求该页面的标题、uri和布局。我该怎么做

我有一个Post模型,我从那里设置页面值

Array
(
    [Post] => Array
        (
            [title] => data[Post][title]
            [body] => 

Post Body

        )

    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )

        )

    [Page] => Array
        (
            [meta_keywords] => data[Page][meta_keywords]
            [meta_description] => data[Page][meta_description]
        )

)
我从控制器执行此操作以设置页面模型的信息

$this->data['Page']['title'] = $this->data['Post']['title'];
结果是这样的:

Array
(
    [Post] => Array
        (
            [title] => data[Post][title]
            [body] => 

Post Body

        )

    [Category] => Array
        (
            [Category] => Array
                (
                    [0] => 1
                    [1] => 2
                    [2] => 3
                    [3] => 4
                )

        )

    [Page] => Array
        (
            [meta_keywords] => data[Page][meta_keywords]
            [meta_description] => data[Page][meta_description]
            [title] => data[Post][title]
        )

)
我的问题是保存时不需要
页面
字段<代码>将以下内容发布到页面


将帖子保存为帖子时,我不需要
[Page][layout]
在帖子控制器中使用该方法的默认视图。页面使用静态页面,在创建页面时需要静态页面,而不是在创建帖子时

您正在对数据进行预处理,然后再进行验证,因此您将从验证中获得一些控制权。当您(在代码中)决定是否需要人工填充某些字段时,您将使验证的这些部分变得多余,并且应该删除它们。如果您在php中有多个验证,您最终会感到困惑


在哪里做这件事,或者如何做得更干净?嗯,
beforeValidate
可能是执行此操作的“正确”位置,但我会在最适合应用程序逻辑的地方执行此操作。函数应该放在优雅之前。

这有点奇怪,因为验证规则应该“保护”进入数据库的内容。如果可以接受空标题,则规则不应为
notEmpty
。请澄清。你的意思是你只想更新其中一个字段,而不需要在过程中触摸
title
等吗?实际上,我应该从另一个模型获取信息,我将从Post['title']获取页面['title'],等等。我应该把它们放在控制器中,并在saveAll进程之前在那里设置值吗?我已经这样做了,但我在想是否还有其他方法。我可以这样设置布局$this->data['Page']['layout']='blah_blah';但是有没有更干净的方法呢?