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 部分。
我设置了一个模型和行为,其中行为包含一些自定义验证规则方法,例如 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 部分。