简体   繁体   English

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

[英]How to use only certain validation set for validating data in Cake PHP?

I was trying to validate my User model data and I came upon this problem. 我试图验证我的用户模型数据,我遇到了这个问题。

Say i have the following validation rules, stored in $validate variable: 假设我有以下验证规则,存储在$ validate变量中:

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

In the UsersController controller, I have two actions: register() and login(). 在UsersController控制器中,我有两个操作:register()和login()。 The problem is, how do I validate the username field in the register() action using ONLY the usernameCheckForRegister rule, and how do I validate the username field in the login() action, using the other rule, usernameCheckForLogin? 问题是,如何仅使用usernameCheckForRegister规则验证register()操作中的用户名字段,如何使用另一个规则usernameCheckForLogin验证login()操作中的用户名字段? Is there any behaviour or method in CakePHP which allows me to choose which set of rules to apply to a form field when validating? CakePHP中是否有任何行为或方法允许我在验证时选择应用于表单字段的规则集?

Thank you in advance for your help! 预先感谢您的帮助!

I think I ran over the solution that fits my needs. 我想我跑过了符合我需求的解决方案。

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

Instead of defining several rules for each field, this behaviour implies defining several "general" rules under which you define all your field-related rules. 此行为不是为每个字段定义多个规则,而是定义了几个“常规”规则,您可以在这些规则下定义所有与字段相关的规则。

So, instead of doing: 所以,而不是做:

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

you do: 你做:

/**
 * 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 */
    )
); 

And then in your controller you toggle between validation sets like this: $this->User->setValidation('register'); 然后在你的控制器中你可以在这样的验证集之间切换: $this->User->setValidation('register');

Even though you have to write a little bit more code, I think this solution best fits my needs 即使您必须编写更多代码,我认为此解决方案最适合我的需求

Check the manual : 查看手册

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

UPDATE: Oh... I just noticed that it seems impossible to use validation rule on login unless you update the user at each login attempt. 更新:哦......我只是注意到,除非您在每次登录尝试时更新用户,否则似乎无法在登录时使用验证规则。 You can modify login () method to verify the username instead. 您可以修改login ()方法来验证用户名。

Bit of a clunky solution but I've just been unsetting the ones I don't use from within the Controller. 有点笨重的解决方案,但我刚刚在Controller中取消了我没有使用的解决方案。 Could get messy but for a simple login/register it does the trick. 可能会变得混乱但是对于简单的登录/注册它可以解决问题。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM