如何仅使用某些验证集来验证Cake PHP中的数据?

时间:2010-08-28 21:17:14

标签: php validation cakephp

我试图验证我的用户模型数据,我遇到了这个问题。

假设我有以下验证规则,存储在$ validate变量中:

var $validate=array(
        "username" => array(
            "usernameCheckForRegister" => array(
                "rule" => ..., 
                "message" => ...
            ),
            "usernameCheckForLogin" => array(
                "rule" => ...,
                "message" => ...
            )
        ),
        //rules for other fields
    );

在UsersController控制器中,我有两个动作:register()和login()。 问题是,如何仅使用usernameCheckForRegister规则验证register()操作中的用户名字段,如何使用另一个规则usernameCheckForLogin验证login()操作中的用户名字段? CakePHP中是否有任何行为或方法允许我在验证时选择应用于表单字段的规则集?

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:8)

我想我已经找到了符合我需求的解决方案。

http://bakery.cakephp.org/articles/view/multivalidatablebehavior-using-many-validation-rulesets-per-model

此行为不是为每个字段定义多个规则,而是定义了几个“常规”规则,您可以在这些规则下定义所有与字段相关的规则。

所以,而不是做:

var $validate=array(
    "username" => array(
        "usernameCheckForRegister" => array(
            "rule" => ..., 
            "message" => ...
        ),
        "usernameCheckForLogin" => array(
            "rule" => ...,
            "message" => ...
        )
    ),
    //rules for other fields
);
你这样做:

/**
 * Default validation ruleset
 */
var $validate = array(
        'username' => /* rules */,
        'password' => /* rules */,
        'email' => /* rules */
    );

/**
 * Custom validation rulesets
 */
var $validationSets = array(
    'register' => array(
        'username' => /* rules */,
        'password' => /* rules */,
        'email' => /* rules */,
    ),
    'login' => array(
        'username' => /* rules */,
        'password' => /* rules */
    )
); 

然后在您的控制器中,您可以在以下验证集之间切换:$this->User->setValidation('register');

即使您需要编写更多代码,我认为此解决方案最符合我的需求

答案 1 :(得分:0)

检查manual

var $validate=array(
        "username" => array(
            "usernameCheckForRegister" => array(
                "rule" => ..., 
                "message" => ...,
                "on" => "create"
            ),
            "usernameCheckForLogin" => array(
                "rule" => ...,
                "message" => ...,
                "on" => "update"
            )
        ),
        //rules for other fields
    );

更新:哦......我只是注意到,除非您在每次登录尝试时更新用户,否则似乎无法在登录时使用验证规则。您可以修改login()方法来验证用户名。

答案 2 :(得分:0)

有点笨重的解决方案,但我刚刚在控制器中取消了我没有使用的解决方案。可能会变得混乱,但对于一个简单的登录/注册它可以解决问题。

unset($this->User->validate['username']['usernameCheckForRegister']);