CakePHP 可以一个行为共享模型 public $validate

CakePHP Can a Behavior share Model public $validate

我设置了一个模型和行为,其中行为包含一些自定义验证规则方法,例如 match 以确保两个字段具有相同的值,这可行,但我想要一些非常通用的 $validate 规则在不同的模型中重用密码之类的东西。当我将 $validate 数组放入我的 ValidateBehavior 并在我的控制器中调用验证时,它似乎没有达到任何验证并且即使字段不正确也一切都通过了。

我可以在我的行为中使用 $validate 让我的模型使用它并在我对 post 调用验证时工作吗? 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
}

Can I use $validate in my behavior have my model use it and work when I invoke validate on a post?

不是您尝试的方式。这是基本的 OOP:如果不传递 A 的实例或继承 A,就无法在 class B 中神奇地调用 class A 的 属性。但这正是您在代码中所期望的。这不适用于行为,也不适用于任何 php 脚本。

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

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

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

与其在那里分配规则,不如将它们合并到那里。所以现在 class B(行为)有一个可用的 A(模型)实例并且可以改变它的 public 属性。

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