CakePHP行为共享模型public $ validate

时间:2015-09-14 17:42:49

标签: validation cakephp cakephp-2.4

我已经设置了一个模型和行为,其中行为包含一些自定义验证规则方法,比如匹配以确保两个字段具有相同的值,这是有效的,但是有一些非常通用的$ validate规则我想重用用于密码之类的不同型号。当我将$ validate数组放入我的ValidateBehavior并在我的控制器中调用validate时,它似乎没有点击任何验证,即使字段不正确,一切都会通过。

我可以在我的行为中使用$ validate让我的模型使用它并在我在帖子上调用验证时工作吗?这post似乎表明我可以,但它不起作用。

MODEL:
class Admin extends AppModel
{
    public $name = 'Admin';
    public $actsAs = [ 'Validate' ];
}

BEHAVIOR:
class ValidateBehavior extends ModelBehavior
{
    public $validate = [
        'currentpassword' => [
            'notEmpty'  => [
                'rule'    => 'notEmpty',
                'message' => 'Current password is required.'
            ],
            'minLength' => [
                'rule'    => [ 'minLength', '8' ],
                'message' => 'Passwords must be at least 8 characters long.'
            ]
        ],
        'newpassword'     => [
            'notEmpty'  => [
                'rule'    => 'notEmpty',
                'message' => 'New password is required.'
            ],
            'minLength' => [
                'rule'    => [ 'minLength', '8' ],
                'message' => 'Passwords must be at least 8 characters long.'
            ],
            'match'     => [
                'rule'    => [ 'match', 'confirmpassword' ],
                'message' => 'New password must match the confirmation password'
        ]

    ],
    ... etc

    public function match( Model $Model, $check, $compareTo )
    {
        $check = array_values( $check )[ 0 ];
        $compareTo = $this->data[ $this->name ][ $compareTo ];

        return $check == $compareTo;
    }
}

function changepassword() {

    $post = $this->request->data;

    // Was there a request to change the user's password?
    if ($this->request->is( 'post' ) && !empty( $post )) {

        // Set and validate the post request
        $this->Admin->set( $this->request->data );

        // Set of validation rules to be run
        $validateRules = [
            'fieldList' => [
                'currentpassword',
                'newpassword',
                'confirmpassword'
            ]
        ];

        if ($this->Admin->validates( $validateRules )) {

            // makes it here even though all fields are empty when
            // the validation rules are in the behavior otherwise
            // when left in the model and the behavior only has 
            // the methods like match this all works
            ...etc
        }
        ...etc
}

1 个答案:

答案 0 :(得分:1)

  

我可以在我的行为中使用$ validate让我的模型使用它并在我在帖子上调用验证时工作吗?

不是你尝试这样做的方式。这是基本的OOP:你不能在没有传递A的实例或继承A的情况下神奇地在类B中调用类A的属性。但这是你在代码中所期望的。这不适用于某个行为,也不适用于任何PHP脚本。

我建议您阅读CakePHP框架的工作原理以及行为的工作原理。书中There are examples也是如此。也许关于OOP。为自己回答这些问题:行为如何知道模型的验证规则?

在Cake2中,每个行为方法都将模型作为第一个参数。在行为的setup()方法中根据需要更改验证规则。

public function setup(Model $Model, $settings = array()) {
    $Model->validate; // Do something with it here
}

不是在那里分配规则,而是将它们合并在那里更好。所以现在B类(行为)有一个A(模型)实例可用,可以改变它的公共属性。

我建议您使用read the chapter about behaviors和php手册OOP部分。